Как иметь ссылку в метке поля формы
Я хочу установить флажок для условий, ярлык которых должен содержать ссылку на страницу, а также условия и условия.
В следующем поле будет указана метка с экранированными тегами.
BooleanField(label="I agree to <a href='terms-conditions.html'>terms&conditions</a>")
Ответы
Ответ 1
Я не уверен, как работает django, но если метка в приведенном выше коде создает:
<label>I agree to terms&conditions</label>
то это НЕ способ сделать это.
Элемент label по умолчанию выбирает связанное поле по умолчанию, поэтому вы должны смешивать 2 действия щелчка (один, который проверяет, а другой - окно)
Я бы просто добавил ваш ярлык и a: href рядом с ним.
<label>I agree to terms&conditions</label> (<a href="terms-conditions.html">terms&conditions</a>)
Ответ 2
Импортируйте django mark_safe из utils.safestring, как описано в http://www.kelvinism.com/howtos/using-html-django-form-label/
Из ссылки:
from django.utils.safestring import mark_safe
from django import forms
class AccountForm(forms.Form):
name = forms.CharField(widget=forms.TextInput(),
max_length=15,
label=mark_safe('Your Name (<a href="/questions/whyname/" target="_blank">why</a>?)'))
Ответ 3
Вот правильная ссылка на документацию Django по теме итерации по форме.
Что вы хотите:
<form method="post">
{% for field in form %}
<p>
{{ field.errors }}
{{ field.label_tag }}: {{ field }}
{% if field.name == "toc" %}
<a href="{% url terms %}">Terms and Conditions</a>
{% endif %}
</p>
{% endfor %}
<p><input type="submit" value="Send message" /></p>
</form>
Ответ 4
Если вы не хотите жестко указывать URL-адрес, вы можете установить метку поля из конструктора:
from django import forms
from django.core.urlresolvers import reverse_lazy
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext as _
class ExampleForm(forms.Form):
name = forms.CharField(max_length='255', label=_('Name'))
forms.BooleanField(label=_("Terms and Conditions"), required=False)
def __init__(self, **kwargs):
super(ExampleForm, self).__init__(**kwargs)
terms_and_conditions = reverse_lazy("terms_and_conditions")
self.fields['read_terms'].label = mark_safe(_("I have read and agree with the "
"<a href='%s'>Terms and Conditions</a>")) % (terms_and_conditions)
Ответ 5
Предположим, вы используете django_registration
- я вижу, что я не единственный человек, у которого была эта проблема:)
Как scunliffe указанная разметка лучше всего оставить без метки тега - вот короткий фрагмент шаблона, чтобы делать то, что вы хотите, не прибегая к написанию всего в HTML:
{% for field in form %}
{{ field.label_tag }}
{% ifequal field.name 'tos' %}
<a href="/terms/">I have read and agreed to the Terms of Service</a>
{% endif %}
{% endif %}
Ответ 6
Я также думаю, что жестко закодировать ссылку в ярлыке не очень хороший вариант. так что будет лучше использовать render_to_string
из django.template.loader
. Также нам нужно думать о лени, как для i18n. keep_lazy_text
и lazystr
соответствуют нашим требованиям к нему. Итак, результат это:
forms.py
from django.utils.functional import keep_lazy_text, lazystr
from django.template.loader import render_to_string
from allauth.account.forms import SignupForm
lazy_render_to_string = keep_lazy_text(render_to_string)
def lazy_render(template_name):
"""
Keep laziness for rendering to string from template
"""
return lazy_render_to_string(lazystr(template_name))
class ExtendedSignupForm(SignupForm):
accept_term_of_use = forms.BooleanField(
label=lazy_render('common/accept_term_of_use_label.html'),
required=True
)
field_order = [
'email',
'password1',
'password2',
'accept_term_of_use'
]
общие /accept_term_of_use_label.html
Accept <a href="{% url "term_of_use" %}" target="_blank">Term Of Use</a> and <a href="privacy_statement" target="_blank">Privacy Statement</a>.