python - 带有子内联表单集的 Django 父表单在渲染时不会排除字段
问题描述
我有一个Parent
模型和Child
具有一对多关系的模型。
在我/manage/
的父 URL 中,我先显示form
模型Parent
,然后再formset
显示Child
模型。
当我渲染form
andformset
时,我得到了所有字段,尽管我在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})
我错过了什么?
解决方案
推荐阅读
- laravel - Laravel Excel 导出
- typescript - Swagger 将名称保留在数字枚举中
- ruby - Nokogiri、HTTParty 和 Twitter
- python - 满足两个条件时如何求和,然后将求和的数据放入新的数据框中?
- android - 如何获取 RecyclerView 当前加载的行/项目
- sql - 在 SQL 中,如何找到并返回最接近选定值的时间值?
- r - 如何在不使用索引的情况下提取向量元素
- javascript - 将网站部署到 Netlify 时如何隐藏 API 密钥
- django - 用户名在 Django 自定义模型中保存为空
- c++ - 关于“复杂”树结构的 C++ Makefile