2010-02-04 65 views

回答

6

这可以完全通过您的模板完成。

你建立你想测试你可以使用每个表单域的表单模板下面的例子构建

<input type="text" class="reg-txt{% if form.fieldname.errors %} errors{% endif %}"/> 

这可以让你提供你想要的界面,而无需修改视图& Django的表单代码。

+5

有什么,可在形式或部件上完成水平?这似乎相当详细,我想要在每个无效的输入字段textarea上选择这个错误类... – 2010-09-22 23:06:28

26

它现在很容易 - 在Django 1.2新功能

刚上窗体类&添加属性你很好走。此功能在文档下一个“新的1.2”的说明中提到,但你可以找到在django.forms.forms.BoundField.css_classes魔这里的API reference,和一个例子:

class MyForm(forms.Form): 
    required_css_class = "required" 
    error_css_class = "error" 
+1

我正在运行1.3,并且这些类都不在模板输出中。我在for循环中使用简单的{{field}}渲染字段。我需要做什么才能做到这一点?它只在输出表格时才起作用吗? – Justin 2011-04-03 21:33:36

+4

你需要使用{{form}}输出整个表单,如果你这样做,你会看到任何格式的类(p,表和列表)。 – 2011-05-04 22:23:37

+0

@BrianFisher基于你的答案是否意味着要么接受{{form}}以获得所需的错误/所需的类,要么建立自己的元素,如果你想更好地控制整个表单和错误的类? – Chris 2011-12-18 18:35:11

26

如果你想将你的错误CSS类形成输入控件(而不是他们的容器),你可以从下面的一个派生窗体类:

class StyledErrorForm(forms.Form): 
    def is_valid(self): 
     ret = forms.Form.is_valid(self) 
     for f in self.errors: 
      self.fields[f].widget.attrs.update({'class': self.fields[f].widget.attrs.get('class', '') + ' error'}) 
     return ret 
+3

注意一个小问题,但是这会覆盖任何在字段构件声明中指定的类(即'attrs')。要简单地附加错误类,请使用下面这行代码(稍微可怕):'self.fields [f] .widget.attrs.update({'class':self.fields [f] .widget.attrs.get('class' ,'')+'error'})' – gregoltsov 2015-08-20 14:37:30

+0

谢谢Gregory,我纠正了我的代码。 – Luca 2015-08-21 16:18:02

1

使用自定义模板...

个人从来没有使用内置在Django错误分级解决方案的运气,另外,我喜欢在错误中使用内置的“striptags”模板过滤器,以摆脱所有的HTML列表的东西,我无法弄清楚如何很好地呈现无论如何。

我使用下面的自定义模板将它们分类为'error_id'。

@register.filter(is_safe=True) 
@stringfilter 
def error_id(value): 
    if value=='': 
     return '' 
    else: 
     return r'<span class="error_id">'+value+'</span>' 

使用呈现在你的模板中的个别错误:

{{ form.my_field.errors|striptags|error_id}} 

或者使用类似渲染整个表单:

<table border="1" cellpadding="5px" align="center"> 
     {% for field in form.visible_fields %} 
      <tr> 
         <td> {{ field.label_tag }}: </td> 
         <td> {{ field }} </td> 
         <td> {{ field.errors|striptags|error_id }} </td> 
      </tr> 

     {% endfor %} 

    </table> 
+1

我使用'{{field.errors.join:“”}}'来显示内联错误,而不是'ul'。并没有HTML的东西。 – Altaisoft 2013-12-22 13:28:40

+1

你可以从你的过滤器中调用脱标签django.template.defaultfilters.stiptags – pymarco 2014-01-14 02:17:19

+0

很酷,谢谢你的提示 – Ninga 2014-01-14 14:27:46