我在表单上写了一个干净的方法,但实际上并没有进行验证。
class Property1Form(forms.ModelForm):
class Meta:
model = Property1
fields = ['unit','propertytype','is_true','date','followup_date','quantity','description']
def __init__(self, *args, **kwargs):
super(Property1Form, self).__init__(*args, **kwargs)
instance = getattr(self, 'instance', None)
if instance:
self.fields['unit'].required = False
self.fields['unit'].widget.attrs['disabled'] = 'disabled'
def clean(self):
form_data = self.cleaned_data
if Property1.objects.filter(unit=form_data['unit'], propertytype=form_data['propertytype'] ).count() > 0:
self._errors["propertytype"] = ["Propertytype already exists for unit"] # Will raise a error message
del form_data['propertytype']
相同的验证在模型级别上对我有用,但在模型级别上我得到500错误
ValidationError at /单元/属性/新/ 6 / http://127.0.0.1:8000/unit/property_details/6/ {'所有':[你的财产不能分配更多然后']}
因此,尝试在表单方面进行相同的验证。
更新:
查看方法
def property_new(request,pk,uri):
unit = get_object_or_404(Unit, pk=pk)
title = 'property'
uri = _get_redirect_url(request, uri)
if request.method == "POST":
form = Property1Form(request.POST)
form.fields['unit'] = unit
if form.is_valid():
properties = form.save(commit=False)
properties.unit = unit
properties.save()
messages.add_message(request, messages.SUCCESS, str(properties.unit) + "-SUCCESS Object created sucssefully")
return redirect(uri)
else:
form = Property1Form(initial={'unit': unit})
return render(request, 'object_edit.html', {'form': form, 'title':title, 'extend': EXTEND})
答案 0 :(得分:2)
您已设置required=False
并已停用unit
字段。这意味着浏览器不会为unit
字段提交任何值。
因此form.cleaned_data['unit']
为None
,因此if
方法中的clean
语句始终为False
。
正如我在other question上建议的那样,我认为设置required=False
并禁用unit
字段是个不错的主意。如果您不希望用户编辑该字段,请不要将其包含在表单中。