覆盖Django ModelForm的Clean_unique方法

时间:2014-11-26 07:58:47

标签: django django-models django-forms django-views

我正在开发一个django app,我的模型中有一个属性unique = True的字段。我正在尝试使用ModelForm在此模型中保存数据。我的模型和模型形式是这样的。

我的models.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。给我一些建议。帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

要停止提供验证唯一的模型形式异常,您可以执行的操作就是覆盖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.

并在您的视图中检查

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