Использование тега шаблона в сообщении об ошибке формы в Django - PullRequest
3 голосов
/ 13 мая 2011

Мой код содержит:

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

Я хочу включить в свое сообщение об ошибке URL, по которому мне нужно передать kwargs.Я использую mark_safe, чтобы якорные текстовые символы не экранировались.

В настоящее время URL, который создается на странице, является (текущий каталог URL) / {% url edit%}.Мой тег воспринимается как текст.

Есть ли способ заставить этот тег URL вести себя как обычно?

Ответы [ 2 ]

0 голосов
/ 13 мая 2011

Вы можете сделать это, но в этом нет необходимости.Эквивалентный код для тега {% url %} в коде Python: 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))
0 голосов
/ 13 мая 2011

Технически, но это немного запутанно. 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 в виде словаря.

ОБНОВЛЕНИЕ: Как отмечает Дэниел Роузман, это не нужно для URL, так как вы можете просто использовать reverse, но если вам нужно визуализировать любой другой тип тега, это метод, который вам нужен.

...