2016-04-02 3 views
0

Я хотел бы отображать сообщения об ошибках django внутри формы в качестве заполнителя, а не выше самого окна ввода формы. Возможно ли это в Django, или я должен достигнуть этого, написав Javascript?Django pass template variable to custom templatetag

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

где {{ошибка}} это сообщение об ошибке Джанго выброшен формой

Я думаю, там должно быть быть каким-то образом получить строковое значение переменной шаблона, но не может найти ответы

EDIT: Я пробовал следующее, безрезультатно

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

Мой заказ templatetag выглядит следующим образом

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

Джанго вызывает ошибку TemplateSyntax жалуясь, что:

заполнителем требует 2 аргумента, 1 при условии

ответ

1

Во-первых, вложенное выражение в системе шаблона Джанго неверен, так placeholder «s аргумент фильтр не должен быть заключен в двойные скобки, но написано прямо:

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

Это может быть сделано.

{{ 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 %} 
"> 
+0

'{{login_form.password | placeholder: {{ошибка | escape}} | addClass: "form-control"}} 'Выдает сообщение об ошибке –

+0

Попробуйте обновленную версию. Я не думаю, что это не взломанный способ. Наличие тега шаблона внутри другого будет рассматриваться как синтаксическая ошибка django ('{{ошибка | escape}}') –

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