首页 > 解决方案 > 带有子内联表单集的 Django 父表单在渲染时不会排除字段

问题描述

我有一个Parent模型和Child具有一对多关系的模型。

在我/manage/的父 URL 中,我先显示form模型Parent,然后再formset显示Child模型。

当我渲染formandformset时,我得到了所有字段,尽管我在fields变量中提到了必要的字段。

表格.py

class ParentForm(ModelForm):
    title = forms.CharField(
        widget=forms.TextInput(
        attrs={
            'class': "input",
        }),
        label='Parent title'
    )

    slug = forms.SlugField(
        widget=forms.TextInput(
        attrs={
            'class': "input",
        }),
        label='Slug'
    )

    description = forms.CharField(
        widget=forms.Textarea(
        attrs={
            'class': 'textarea',
        }),
        label='Description'
    )

    class Meta:
        model = Parent
        fields = ['title', 'slug', 'description']


class ChildForm(ModelForm):
    title = forms.CharField(
        widget=forms.TextInput(
        attrs={
            'class': "input",
        }),
        label='Child title'
    )

    slug = forms.SlugField(
        widget=forms.TextInput(
        attrs={
            'class': "input",
        }),
        label='Slug'
    )

    order = forms.IntegerField(
        widget=forms.TextInput(
        attrs={
            'class': "input",
            'placeholder' :"0"
        }),
        label='Order'
    )

    class Meta:
        model = Child
        fields = ['title', 'slug', 'order']


class ParentManageForm(ParentForm):

    def __init__(self, *args, **kwargs):
        super(ParentManageForm, self).__init__(*args, **kwargs)

    class Meta(ParentForm.Meta):
        fields = ['title',]


class ChildManageForm(ChildForm):

    def __init__(self, *args, **kwargs):
        super(ChildManageForm, self).__init__(*args, **kwargs)

    class Meta(ChildForm.Meta):
        fields = ['title', 'order']


ChildFormset = inlineformset_factory(
    Parent, 
    Child, 
    form=(ChildManageForm)
)

视图.py

class ParentManage(LoginRequiredMixin, UpdateView):
    login_url = reverse_lazy('login')
    model = Parent
    form_class = ParentManageForm
    slug_url_kwarg = 'parent_slug'
    template_name_suffix = '-manage'

    def get_object(self):
        return Parent.objects.get(slug=self.kwargs['parent_slug'])

    def get_context_data(self, **kwargs):
        data = super().get_context_data(**kwargs)
        if self.request.POST:
            data["children"] = ChildFormset(self.request.POST, instance=self.object)
        else:
            data["children"] = ChildFormset(instance=self.object)
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        children = context["children"]
        self.object = form.save()
        if children.is_valid():
            children.instance = self.object
            children.save()
        return super().form_valid(form)

    def get_success_url(self):
        parent = self.get_object()
        return reverse("parent-detail", kwargs={'parent_slug': parent.slug})

我错过了什么?

标签: pythondjangodjango-formsdjango-views

解决方案


推荐阅读