【问题标题】:Using a template tag within a form error message in Django在 Django 的表单错误消息中使用模板标签
【发布时间】:2011-08-25 04:05:55
【问题描述】:

我的代码包含:

Class GroupForm(forms.ModelForm):
    ....
    def clean_name(self):
        ....
        raise forms.ValidationError(mark_safe('....<a href="{% url edit %}">click here</a>.'))

我想在我的错误消息中包含一个我需要传递 kwargs 的 url。我正在使用 mark_safe 以便我的锚文本字符不会被转义。

目前在页面上生成的 url 是 (current url directory)/{% url edit %} 。它只是将我的标签视为文本。

有没有办法让这个 url 标签表现得像平常一样?

【问题讨论】:

    标签: django django-forms django-templates


    【解决方案1】:

    从技术上讲,但这有点令人费解。 ValidationError 需要纯文本,因此您将不得不以一种或另一种方式给出它。但是您可以在将文本提供给ValidationError之前自己渲染文本:

    Class GroupForm(forms.ModelForm):
        ....
        def clean_name(self):
            from django.template import Context, Template
            t = Template('....<a href="{% url edit %}">click here</a>.')
            c = Context()
            raise forms.ValidationError(t.render(c))
    

    Template.render() 需要一个上下文,这就是为什么我只传入一个空的。但是如果你有额外的变量并且你也需要渲染,你可以将它们以字典的形式传递给Context

    更新: 正如 Daniel Roseman 所提到的,这对于 URL 来说是不必要的,因为您可以使用 reverse,但如果您需要呈现任何其他类型的标签,这就是您需要的方法。

    【讨论】:

      【解决方案2】:

      您可以这样做,但没有必要这样做。 Python代码中{% url %}标签的等效代码为django.core.urlresolvers.reverse

      from django.core.urlresolvers import reverse
      
      ...
      
          url = reverse("edit")
          raise forms.ValidationError(mark_safe('....<a href="%s">click here</a>.' % url))
      

      【讨论】:

      • 哈哈。正确的。在我什至意识到这是他想要处理的 URL 之前,我已经回答了他的问题,即使那时我也没有停下来思考reverse。那好吧。 ;)
      猜你喜欢
      • 2013-05-18
      • 1970-01-01
      • 2011-03-04
      • 2021-08-10
      • 2014-03-20
      • 1970-01-01
      • 2012-09-10
      • 2017-07-30
      • 2019-09-23
      相关资源
      最近更新 更多