django - 覆盖 Django ModelForm 的 Clean_unique 方法

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

我正在开发一个 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/

相关文章:

Django : Formset as form field

django - 以表单形式访问管理模型实例

python - Django:列表显示管理中的外键值

django - 如何仅删除 m2m 关系?

django - 尝试进行迁移时获得 "The following content types are stale and need to be deleted"。这是什么意思,我该如何解决?

django - Django弹出错误消息

python - 图书的 CSV 解析

Django admin 内联自定义查询集

django - Django-Guardian 可以做什么 Django Auth 权限无法做到的事情?

django 1.3 服务器错误