Django将模板变量传递给自定义模板标签

时间:2016-04-02 13:31:10

标签: python django templates

我想在表单中将django我的错误消息显示为占位符,而不是在表单输入框本身上方。这在Django中是可能的,还是我必须通过编写一些Javascript来实现这一点?

    <div class="form-group">

        {% if login_form.password.errors %}
            {% for error in login_form.password.errors %}
                <p>{{ error }}</p>
            {% endfor %}
        {% endif %}

        <div class="input-group">
            <span class="input-group-addon"><i class="fa fa-key fa-fw"></i></span>
            {{ login_form.password | placeholder:"password" | addClass:"form-control" }}
        </div>

    </div>

特定兴趣线。我想改变这个:

{{ login_form.password | placeholder:"password" | addClass:"form-control" }}

到此

{{ login_form.password | placeholder:{{ error }} | addClass:"form-control" }}

其中{{error}}是由表单

抛出的Django错误消息

我认为必须有某种方法来获取模板变量的字符串值,但无法找到任何答案

编辑:我已经尝试了以下内容,但无济于事

<div class="form-group">
    {% if login_form.password.errors %}
        {% for error in login_form.password.errors %}
            <div class="input-group">
                <span class="input-group-addon"><i class="fa fa-key fa-fw"></i></span>
                {{ login_form.password | placeholder:{{ error|escape }} | addClass:"form-control" }}
            </div>
        {% endfor %}
    {% endif %}
</div>

我的自定义模板标签如下所示

@register.filter(name='placeholder')
def placeholder(value, token):
    value.field.widget.attrs["placeholder"] = token
    return value

Django抛出一个TemplateSyntax错误抱怨:

占位符需要2个参数,1提供

3 个答案:

答案 0 :(得分:2)

首先,django模板系统中的嵌套表达式不正确,因此placeholder的过滤器参数不应该用双括号括起来,而是直接写入:

{{ login_form.password | placeholder:error | addClass:"form-control" }}

此处,error变量在外部花括号范围的上下文中正确计算。

其次,我建议确保过滤器参数的类型。如果您确实需要字符串值,则可以使用内置过滤器进行显式转换:

{% with err_msg=error|stringformat:"s" %}
{{ login_form.password | placeholder:err_msg | addClass:"form-control" }}
{% endwith %}

答案 1 :(得分:1)

这可以做到。

{{ login_form.password.errors }}

以下是https://docs.djangoproject.com/en/1.9/topics/forms/#rendering-form-error-messages

的相关文档

这段代码应该重写为

{{ login_form.password | placeholder:"password" | addClass:"form-control" }}
{% if login_form.password.errors %}
   <span class="error">{{ login_form.password.errors }}</span>
{% endif %}

或者也可以这样做

{{ login_form.password | placeholder:"password" | addClass:"form-control" }}
<input type="password" class="form-control" placeholder="
{% if login_form.password.errors %}
   {{ login_form.password.errors }}
{% else %}
   password
{% endif %}
">

答案 2 :(得分:1)

我还没有测试过,但这可能有用:

# forms.py
class MyForm(forms.Form):
    class meta:
        model = MyModel

    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        error_messages = self.fields['myfield'].error_messages
        self.fields['myfield'].widget.attrs.update({'placeholder': error_messages})