在 Django 中发生错误时呈现管理表单
Posted
技术标签:
【中文标题】在 Django 中发生错误时呈现管理表单【英文标题】:Rendering Admin Forms When An Error Occurs in Django 【发布时间】:2011-09-16 17:19:50 【问题描述】:我有一个模型,它包含一个带有外键的字段,这个字段可以是 NULL 并且是可选的。如果此字段没有值,我可以将此表单保存在管理页面中而不会出现任何问题。但是,当我的表单出现错误时,我的表单无法呈现,Django 返回以下错误:
Caught ValueError while rendering: need more than 0 values to unpack on line 19
9 % for field in line %
10 <div% if not line.fields|length_is:'1' % class="field-box% if not field.is_readonly and field.errors % errors% endif %"% endif %>
11 % if not line.fields|length_is:'1' and not field.is_readonly % field.errors % endif %
12 % if field.is_checkbox %
13 field.field field.label_tag
14 % else %
15 field.label_tag
16 % if field.is_readonly %
17 <p> field.contents </p>
18 % else %
19 field.field
20 % endif %
21 % endif %
22 % if field.field.field.help_text %
23 <p class="help"> field.field.field.help_text|safe </p>
24 % endif %
25 </div>
26 % endfor %
27 </div>
28 % endfor %
29 </fieldset>
这是我的模型的样子:
class Circuit(CommonFields):
"""Circuit class model."""
vid = models.AutoField(primary_key=True)
vname = models.CharField(
'Vendor Name',
max_length=100,
null=True,
blank=True)
vspc = models.ForeignKey(
Room,
db_column='avspc',
verbose_name='Space',
null=True,
blank=True)
这是我的自定义表单的自定义 clean():
def clean(self):
"""Custom port range validator."""
super(CircuitForm, self).clean()
raise forms.ValidationError("Some stupid error just happened.")
cleaned_data = self.cleaned_data
return cleaned_data
请注意,如果我删除 raise 语句,我的表单可以成功提交,但是,当我提出错误时,它会给我上述错误。
有什么想法可以在出现错误时呈现我的表单吗?
请注意,仅当我在未设置可选字段的情况下创建新条目或编辑未设置可选字段的条目时才会出现此错误。如果我正在编辑设置了这些可选字段的现有条目,如果我取消设置可选字段,它不会给出任何错误。
【问题讨论】:
我实际上已经修好了。我在 init 方法中使用字典手动初始化这些字段,而我必须使用如下元组列表:[("", "--Select--")]。很抱歉给您带来不便。 如果您可以将其放入答案中,然后将其标记为正确,它将帮助其他有类似问题的人。 我发现你的 clean 方法有问题。你一定是在引发 ValidationError 之前忘记了 if 子句,无论你的数据是什么,这个干净的方法总是会引发 ValidationError。也许只是一个错字? 【参考方案1】:@GeoffroyCALA 是对的,您需要条件来引发异常。如果您不检查条件,无论如何都会引发异常。此外,您没有指定为其设置自定义例外的表单域。请参阅docs example。
试试这样的:
def clean(self):
"""Custom port range validator."""
cleaned_data = self.cleaned_data
if cleaned_data['vpc'] not in Room.objects.values_list('id', flat=True): # FOR EXAMPLE
raise forms.ValidationError("Some stupid error just happened.")
super(CircuitForm, self).clean()
return cleaned_data
【讨论】:
以上是关于在 Django 中发生错误时呈现管理表单的主要内容,如果未能解决你的问题,请参考以下文章