基于条件的Django清理方法(两个视图中使用一种形式)

基于条件的Django清理方法(两个视图中使用一种形式),django,django-forms,django-views,Django,Django Forms,Django Views,我有一个表单,在两个视图中使用。一个保存,一个编辑/更新。我使用一个clean函数来检查独特的条件。(表单有三个字段。三个字段的组合只能出现一次。) 现在,当我使用相同的表单时,它会检查视图-保存和编辑的条件。这将导致表单在“编辑”视图中抛出一个错误,指出该值已存在 我如何才能使用这个clean方法,让它检查save视图的验证,而不检查edit视图 编辑视图: @login_required def permissionEditView(request, pk): data = mode

我有一个表单,在两个视图中使用。一个保存,一个编辑/更新。我使用一个clean函数来检查独特的条件。(表单有三个字段。三个字段的组合只能出现一次。)

现在,当我使用相同的表单时,它会检查视图-保存和编辑的条件。这将导致表单在“编辑”视图中抛出一个错误,指出该值已存在

我如何才能使用这个clean方法,让它检查save视图的验证,而不检查edit视图

编辑视图:

@login_required
def permissionEditView(request, pk):
    data = models.PermissionModel.objects.get(pk=pk)
    p_form = forms.PermissionForm(instance=data)
    if request.method == 'POST':
        p_form = forms.PermissionForm(request.POST, instance=data)
        if p_form.is_valid():
            p_form.save()
            messages.success(request, 'Permission updated successfully.')
            return redirect(companyProfileView)
    return render(request, 'company_profile.html', {'p_form': p_form})
保存视图:

def permissionFormView(request):
    p_form = forms.PermissionForm()
    if request.method == 'POST':
        p_form = forms.PermissionForm(request.POST)
        if p_form.is_valid():
            p_form.save()
            messages.success(request, 'Permission added successfully.')
            return redirect(companyProfileView)
    return render(request, 'company_profile.html', {'p_form': p_form})
使用清洁方法形成:

class PermissionForm(forms.ModelForm):
    class Meta:
        model = models.PermissionModel
        fields = '__all__'

    def clean(self):
        role = self.cleaned_data.get('role_name')
        feature = self.cleaned_data.get('feature')
        if models.PermissionModel.objects.filter(role_name=role, feature=feature).exists():
            raise forms.ValidationError('Permission exists.')

    def __init__(self, *args, **kwargs):
        super(PermissionForm, self).__init__(*args, **kwargs)
        for field in self.fields:
            self.fields[field].widget.attrs = {'class': 'form-control form-control-sm'}
您可以在clean方法中检查实例


您可以使用clean方法检查实例

谢谢您的想法。为了让代码正常工作,我不得不对代码稍加修改。我把它和self关键字一起使用------如果不是self.form.instance:接受这个想法。谢谢你的想法。为了让代码正常工作,我不得不对代码稍加修改。我把它和self关键字一起使用-----如果不是self.form.instance:接受这个想法。
def clean(self):
        role = self.cleaned_data.get('role_name')
        feature = self.cleaned_data.get('feature')
        if not form.instance:
            if models.PermissionModel.objects.filter(role_name=role, feature=feature).exists():
                raise forms.ValidationError('Permission exists.')