我正在开发一个 Django 应用程序,其中我有一个模型,该模型有一个属性 unique=True 的字段。我正在尝试使用 ModelForm 在此模型中保存数据。我的模型和模型形式是这样的。
我的模型.py
class MyModel(models.Model):
field1 = models.CharField(max_length=40, unique=True)
def __unicode__(self):
return self.field1
class DuplicateFields(models.Model):
field1 = models.CharField(max_length=30)
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
def clean_field1(self):
value = self.cleaned_data['field1']
if value :
if MyModel.objects.filter(field1=value).count() > 0:
DuplicateFields.objects.create(field1=value)
return Value
raise forms.ValidationError('this field is required')
**I tried below given code also but it also raise Unique field Exception or error **
def clean_unique(form, field, exclude_initial=True,
value = form.cleaned_data.get(field)
if value:
objs = MyModel.objects.filter(field1=value)
if objs.count() > 0:
DuplicateFields.objects.create(field1=value)
return value
def clean_field1(self):
value=clean_unique(self,'field1')
**我的 Views.py 是 **
if request.method=='POST':
form = MyModelForm(request.POST)
if form.is_valid():
cleaned_data = form.cleaned_data
field = cleaned_data['field1']
form.save()
return HttpResponse('form has been saved successfully')
else:
print 'form is invalid'
print form._errors
return render_to_response(template_name, {'form':form}, ci)
else:
return render_to_response(template_name, {'form':form}, ci)
我想要做的是在保存数据或调用 form.is_valid()
方法时,如果我发现我尝试存储的数据已存在于模型中,则不要引发验证错误我想执行一些其他逻辑,例如将其存储在其他模型中。
但在我看来,当我调用“form.is_valid()”时,它返回 False。给我一些建议。帮助将不胜感激
最佳答案
要停止提供验证唯一模型表单异常,您可以做的就是覆盖 django ModelForm 的 validate_unique 方法。就像
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
def validate_unique(self):
exclude = self._get_validation_exclusions()
try:
self.instance.validate_unique(exclude=exclude)
except forms.ValidationError as e:
try:
del e.error_dict['field1'] #if field1 unique validation occurs it will be omitted and form.is_valid() method pass
except:
pass
self._update_errors(e) #if there are other errors in the form those will be returned to views and is_valid() method will fail.
并在您的 View 中检查
if form.is_valid():
field1=form.cleaned_data['form1']
try:
MyModel.objects.get(field1=field1)
#write your logic here for duplicate entry
except:
MyModel.objects.create(field1=field1)
return render_to_response('template.html')
else:
return render_to_response('template.html')
关于django - 覆盖 Django ModelForm 的 Clean_unique 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27143896/