【问题标题】:How can we achieve custom validation in django class based views(create and update view)我们如何在基于 django 类的视图中实现自定义验证(创建和更新视图)
【发布时间】:2020-01-20 10:47:55
【问题描述】:

我想在基于类的视图中使用唯一性验证。

这里我有 createView,我想在表单发布时添加 part_no 唯一性验证。

我们怎样才能做到这一点?

任何解决方案。

Views.py

class SparePartsCreate(CreateView): 
    template = 'maint/spareparts_form.html'
    model = SpareParts
    fields = ['name', 'description', 'part_no']
    success_url = reverse_lazy('spare_parts')

    form.py
    class SparePartForm(forms.ModelForm):
        name = forms.CharField(required=True, label='Spare Part Name')
        description = forms.CharField(required=True, label='Spare Part Description')
        part_no = forms.CharField(required=True, label='Spare Part Number', max_length=6)
        class Meta:
            model = SpareParts
            fields = ['name','description','part_no']
        def __init__(self, *args, **kwargs):
            self.request = kwargs.pop('request', None)
            super(SparePartForm, self).__init__(*args, **kwargs)

当我们在 form.py 中的 clean 方法下在基于函数的视图中实现验证时。

对于基于类的视图有什么?

【问题讨论】:

    标签: django django-models django-rest-framework django-forms


    【解决方案1】:
    def clean_part_no(self):
        part_no = self.cleaned_data.get('part_no')
        qs = SpareParts.objects.filter(part_no=part_no)
        if qs.exists():
            raise forms.ValidationError('This part_no already taken, please use a different one.')
        return part_no
    

    在您的 forms.py 中使用这种方式,或者在 models.py 文件中将其设置为 unique=True

    【讨论】:

    • 这里我用的是CreateView,所以我觉得这个clean方法不适用。
    • 如果我使用基于函数的视图,那么 clean 方法将起作用。
    • 这个你必须在你的表单中添加,它也应该适用于 cbv
    • 其实我没有在 form.py 文件中得到 part_no vale。
    • 这个 CreateView 呈现自己的表单。我已删除 form.py 中的表单。但是我的项目与以前的工作相同,即它不使用表单。
    【解决方案2】:
    class SparePartForm(forms.ModelForm):
            name = forms.CharField(required=True, label='Spare Part Name')
            description = forms.CharField(required=True, label='Spare Part Description')
            part_no = forms.CharField(required=True, label='Spare Part Number', max_length=6)
            class Meta:
                model = SpareParts
                fields = ['name','description','part_no']
            def __init__(self, *args, **kwargs):
                self.request = kwargs.pop('request', None)
                super(SparePartForm, self).__init__(*args, **kwargs)
    
           def clean_part_no(self, value):
              """ here you can validate the data  """
              if True:
                 return value
              else:
                 raise forms.validationError("error message ")
    

    【讨论】:

    • 感谢您的建议。但是在这里我使用了基于类的视图而不是基于乐趣的视图。
    • 真的没关系,形式不依赖于你使用的类库或函数库的视图
    • CreateView 渲染自创建视图表单。
    猜你喜欢
    • 2013-06-16
    • 1970-01-01
    • 2022-11-11
    • 2015-08-25
    • 2015-02-02
    • 2013-10-09
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多