简体   繁体   中英

Django: how do I include a url link in a form label

My use case looks very basic but I couldn't find anything on the web!

The idea is a form with checkbox "I have read and agree to the terms and conditions" And a link on "terms and conditions" which points to a page with such terms and conditions... Classic!

So I have a field in my form as follows:

tos = forms.BooleanField(widget=forms.CheckboxInput(),
                         label=_(u'I have read and agree to the <a href="%s" target="_blank">terms and conditions</a>' % reverse('terms_of_use')),
                         initial=False)

where 'terms of use' is the name of one of my url patterns in urls.py

But I get an error:

ImproperlyConfigured: The included urlconf urls doesn't have any patterns in it

My urlconf works fine on the whole site so I supposed that the problem was that the urlconf is not yet populated when the form is rendered ?

I tried using lazy_reverse = lazy(reverse, str) instead of reverse, but it doesn't solve anything.

Is there a way to make this work ? The use case seems very very basic so there surely is a way to do it without having to break up the form inside my template ?!

lazy_reverse won't work since you're turning around and unlazying it the second after with your "...%s..." % lazy(blah) notation.

I suppose you could try to lazy the whole thing, ie

label = lazy(lambda: _("bla %s bla" % reverse('something')))

but I did not test this

alternatively, just override the label at __init__ , ie

self.fields['myfield'].label = 'blah %s bla' % reverse('bla')

You can provide a link a form label like this:

foo_filter=forms.ModelChoiceField(FooFilter.objects.all(),
               label=format_html('<a href="{}">{}</a>', reverse_lazy('foo-filter'), 
                                 FooFilter._meta.verbose_name))

See AppRegistryNotReady: lazy format_html()?

I use this syntax

from django.urls import reverse
from django.utils.functional import lazy

privacy = forms.BooleanField(label = lazy(lambda: _("Privacy <a href='%s' a>policy</a>" % reverse('privacy'))))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM