使用django的`reverse_lazy`并连接它

时间:2015-07-06 00:06:11

标签: python django

我想将已解析的网址插入到字符串中,用作表单字段的help_text

class ContactForm(forms.Form):

    [...]

    email_sender = forms.EmailField(
        label="Votre email",
        widget=forms.EmailInput(attrs={'disabled': 'disabled'}),
        help_text="[...], <a href='{}'>[...]</a>.".format(reverse_lazy('account_email'))
    )

但是将反转的URL插入到字符串中是不可能的,因为format函数(或我尝试的任何连接方式)不是&#34;懒惰&#34;,并且想要立即生成输出。

我收到以下错误:

django.core.exceptions.ImproperlyConfigured: The included urlconf 'myproject.urls' does not appear to have any patterns in it. If you see valid patterns in the file then the issue is probably caused by a circular import.

例如,使用以下代码可以很好地工作,但不是我想要的:)

    email_sender = forms.EmailField(
        help_text=reverse_lazy('account_email')
    )

那么如何连接一个&#34; lazy&#34;值?

2 个答案:

答案 0 :(得分:5)

你不能在Django中连接延迟字符串。实现是非常基本的,它甚至不是实际的懒字符串,它是懒惰的函数调用,它们可能返回其他类型。当你执行reverse_lazy时,你只会得到一个没有特殊其他行为的惰性函数调用

所以,只要遵守规则。如果您需要延迟计算字符串,请自行创建一个惰性函数:

from django.utils.functional import lazy

def email_sender_help_text():
    return "[...], <a href='{}'>[...]</a>.".format(reverse('account_email'))

email_sender_help_text_lazy = lazy(email_sender_help_text, str)

您现在可以使用它:

email_sender = forms.EmailField(
    help_text=email_sender_help_text_lazy()
)

或者,对于更通用的版本:

from django.utils.functional import lazy

def format(string, *args, **kwargs):
    return string.format(*args, **kwargs)
lazy_format = lazy(format, str)

help_text=lazy_format("<a href='{}'>", reverse_lazy('account_email'))

您可能还想查看django.utils.functional.allow_lazy

答案 1 :(得分:1)

在最新版本的django中,有一个名为format_lazy的实用程序函数:https://docs.djangoproject.com/en/3.0/ref/utils/#django.utils.text.format_lazy