如何在表单字段的标签中添加链接

时间:2008-12-22 11:34:24

标签: django

我想要一个条款和条件的复选框,其标签应包含指向页面的链接,以及条款和条件。

以下字段将包含标签转义的标签。

BooleanField(label="I agree to <a href='terms-conditions.html'>terms&conditions</a>")

7 个答案:

答案 0 :(得分:30)

按照http://www.kelvinism.com/howtos/using-html-django-form-label/

中的说明从utils.safestring导入django的mark_safe

从链接:

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>?)'))

答案 1 :(得分:11)

以下是指向the Django documentation on the subject of iteration over the form的正确链接。

你想要的是:

<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>

答案 2 :(得分:7)

如果不想对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)

答案 3 :(得分:3)

我不确定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>)

答案 4 :(得分:2)

让我猜一下 - 你正在使用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 %}

答案 5 :(得分:0)

我还认为在标签中硬编码链接不是一个好方法。因此最好使用render_to_string中的django.template.loader。我们还需要考虑像i18n这样的惰性。 keep_lazy_textlazystr符合我们的要求。结果就是这样:

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'
    ]

common / 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>.

答案 6 :(得分:0)

我知道这个问题很旧,但是我找到了解决方法

forms.py

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'))))