Обратный URL в модели Django help_text

Я хочу добавить ссылку на условия в help_text свойство django model_field, в основном я хотел бы написать код, например:

 class UserRegisterData(models.Model):

    accepted_terms = models.BooleanField(
           ...
           help_text = u""Terms and conditions are avilable on <a href="{reg}">this iste</a> stronie""".format(reg = reverse("terms"))
     )

Очевидно, что это не помогает, потому что urlconfs не подготовлены, пока модели создаются.

Я даже пытался завернуть help_test в SimpleLazyObject но это все еще не сработало.

Я бы предпочел не трогать код шаблона. Есть ли способ добиться этого без жесткого URL-адреса в строке или настройках?

1 ответ

Решение

Я думаю это то что django.core.urlresolvers.reverse_lazy предназначен для.
Для информации: он был добавлен в django в 1.4, поэтому, если вы используете более раннюю версию, вам нужно будет обновить ее.


Как упомянуто в комментариях, вам все равно нужно обойти форматирование строк, которое устраняет "лень" обратного URL:

from django.utils.translation import string_concat

# ...

help_text = string_concat( # Happens to be lazy!
                u'Terms and conditions are available on <a href="', 
                reverse_lazy("terms"),
                u'">this site</a>"',
)

По состоянию на Django 2,1 django.utils.translation.string_concat() был удален и помечен как устаревший в более ранних версиях.

Чтобы оценить ленивые объекты в str.format() как синтаксис теперь вы должны использовать format_lazy() вместо.

Пример:

my_field = forms.BooleanField(
        # ...
        help_text=format_lazy(
            '''
            Please click <a href='{}'>here</a>.
            ''',
            reverse_lazy('my-viewname')
        )
)

Обратите внимание, что вам, возможно, придется явно пометить help_text контент как безопасный для целей вывода HTML. Возможное решение для этого может быть в шаблоне и с помощью безопасного фильтра:

{{ my_field|safe }}
Другие вопросы по тегам