如何使用admin.表内嵌在一个ModelForm



完整故事

仅在condition为true时验证admin表单

我正试图验证表单是否有答案。为了在管理员中验证表单,您需要创建一个新表单并告诉管理员。ModelAdmin类来使用这个表单。

正确吗?

我已经创建了一个表单,但是现在我不能使用内联表单。如果我把它放在管理员。ModelAdmin,它仍然显示,我仍然可以填写,但它不出现在表单cleaned_data,如果它是在post数据。

如何在QuestionAdminForm中使用ChoiceInline ?

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 4

#TODO: move?
class QuestionAdminForm(forms.ModelForm):
    choices = ChoiceInline
    class Meta:
        model = Question
    def clean(self):
        data = self.cleaned_data
        #logger.info(data)
        choices = self.cleaned_data['choices']
        #logger.info(data)
        if not self.choices_set.filter(
                choice=choices.strip(), is_correct=True).exists():
            raise forms.ValidationError("Wrong choice!")
        # Always return the cleaned data, whether you have changed it or
        # not.
        return data

class QuestionAdmin(admin.ModelAdmin):
    readonly_fields = ('average', 'last_updated')
    #list_display = ["question", "module", "average", "quiz"]
    #can't have below because M2M question-> module
    #list_display = ["question", "module", "average"]
    list_display = ["question", "average"]
    list_display_links = ["question"]
    list_filter = ['modules__name']
    search_fields = ["question", "modules__name", "quiz__name"]
    inlines = [ChoiceInline]
    actions = [duplicate_questions]
    form = QuestionAdminForm

这是我最终基于Django管理验证的内联表单,它依赖于所有表单之间字段的总和

class CombinedFormSet(BaseInlineFormSet):
    # Validate formset data here
    def clean(self):
        super(CombinedFormSet, self).clean()
        for form in self.forms:
            if not hasattr(form, 'cleaned_data'):
                continue
            data = self.cleaned_data
            valid = False
            for i in data:
                if i != {}:
                    if i['is_correct']:
                        valid = True
            if not valid:
                #TODO: translate admin?
                raise forms.ValidationError("A Question must have an answer.")
            # Always return the cleaned data, whether you have changed it or
            # not.
            return data

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 4
    formset = CombinedFormSet

最新更新