django admin 表单集的相互依赖验证

问题描述 投票:0回答:1

我在管理模型中有两个内联

class AdminModel(admin.ModelAdmin):
     ...
     inlines = [inline1, inline2]
     form = AdminModelForm
     model =model

class inline1(admin.TabularInline):
    form = inline1form
    model = inline1model
class inline2(admin.TabularInline):
    form = inline2form
    model = inline2model

class inline1form(forms.ModelForm):
    class Meta:
        model = inline1Edge
        fields = ("field1",)

class inline2form(forms.ModelForm):
    class Meta:
        model = inline2Edge
        fields = ("field2",)

class AdminModelForm(forms.ModelForm):
    ....

admin.site.register(model, AdminModel)

现在我的任务是检查两个内联中是否有两个字段具有值(一个在 inline1 中,另一个在 inline2 中),然后显示错误

我提出了一个解决方案,在创建表单集时,我检查字段是否有 vlaue 然后返回答案

即修改自定义方法`

class AdminModel(admin.ModelAdmin):
    def _create_formsets(self, request, new_object, change):
            formsets, inline_instances = super()._create_formsets(request, new_object, change)
            if request.method == "POST":
                location_formset = None
                individual_formset_validated = all([formset.is_valid() for formset in formsets])

                if not individual_formset_validated:
                    return individual_formset_validated


                # custom check condition on formsets

                if check_fail:
                     inline1formset.non_form_errors().extend(
                    ["Please select values for only one field, field1 config or field2 config"]
                )
            return formsets, inline_instances

这工作正常,并在内联中添加错误

还有其他Pythonic方法可以帮助我解决这个任务吗?

python django django-forms django-admin formset
1个回答
0
投票

您可以使用更简洁的方法重构您的验证逻辑

from django.core.exceptions import ValidationError

class Inline1Formset(forms.BaseInlineFormSet):
    def clean(self):
        super().clean()
        for form in self.forms:
            field1_value = form.cleaned_data.get("field1")
            # Store value in the formset or raise ValidationError here if needed.

class Inline2Formset(forms.BaseInlineFormSet):
    def clean(self):
        super().clean()
        for form in self.forms:
            field2_value = form.cleaned_data.get("field2")
            # Store value in the formset or raise ValidationError here if needed.

使用自定义表单集在两个内联之间强制执行验证。

class AdminModel(admin.ModelAdmin):
    inlines = [Inline1, Inline2]
    form = AdminModelForm

    def _create_formsets(self, request, obj, change):
        formsets, inline_instances = super()._create_formsets(request, obj, change)
        
        if request.method == "POST":
            formset_valid = all([formset.is_valid() for formset in formsets])
            
            if not formset_valid:
                return formsets, inline_instances
            
            # Extract the relevant data for cross-formset validation
            inline1_formset = [fs for fs in formsets if isinstance(fs, Inline1Formset)][0]
            inline2_formset = [fs for fs in formsets if isinstance(fs, Inline2Formset)][0]
            
            field1_value = any(form.cleaned_data.get("field1") for form in inline1_formset)
            field2_value = any(form.cleaned_data.get("field2") for form in inline2_formset)

            if field1_value and field2_value:
                inline1_formset.non_form_errors().append(
                    "Please select values for only one field: field1 or field2."
                )
        
        return formsets, inline_instances
© www.soinside.com 2019 - 2024. All rights reserved.