Python 使用django中基于关系的键值创建表单
我有一个基于django的应用程序,我想从模型中创建一个键、值对的表单。“子”模型由以下数据行组成:Python 使用django中基于关系的键值创建表单,python,django,django-forms,Python,Django,Django Forms,我有一个基于django的应用程序,我想从模型中创建一个键、值对的表单。“子”模型由以下数据行组成: (<parent 1>, 'component 1', 'dummy content 1'), (<parent 1>, 'component 2', 'dummy content 2'), 下面是我目前在其他表单中使用的直接模型到表单映射,以保持它的直接性和简单性 # forms.py class MyForm(ModelForm): class Meta:
(<parent 1>, 'component 1', 'dummy content 1'),
(<parent 1>, 'component 2', 'dummy content 2'),
下面是我目前在其他表单中使用的直接模型到表单映射,以保持它的直接性和简单性
# forms.py
class MyForm(ModelForm):
class Meta:
model = Child
fields = () # fields go here
然后我把这张表格交给我的意见。视图页面_视图获取父级的pk,获取父级并将其传递给表单。然后,表单通过视图传递到模板父级_view.html
# views.py
@login_required
def page_view(request, parent_pk):
parent = get_object_or_404(Parent, pk=pk)
my_form = MyForm(request.POST, instance=parent)
return render(request, 'parent_view.html', {
'parent': parent,
'my_form': my_form,
})
在模板中,我按如下方式呈现表单:
<!-- page_view.html -->
{{ my_form }}
<form action=''>
<label for='component_1'>component 1</label>
<textarea name='component_1' type='text'>dummy content 1</textarea>
<label for='component_2'>component 2</label>
<textarea name='component_2' type='text'>dummy content 2</textarea>
</form>
但我似乎不知道如何在“我的表格”中处理这个问题。我环顾了stackoverflow的几个解决方案,但没有一个能为我指明解决这个问题的正确方向。如果有人有任何想法,我将不胜感激。提前感谢。如果有多个子实例,那么单个表单将没有多大用处,您必须使用一个表单集一个模型表单集才能精确 根据文件, 表单集是一个抽象层,用于在同一页面上处理多个表单
# forms.py
# You can provide a text area widget for the field that you want to be displayed as a text area
class MyForm(ModelForm):
class Meta:
model = Child
fields = () # fields go here
widgets = {
'field_name': forms.Textarea(attrs={'cols': 80, 'rows': 3}),
}
ChildFormset = forms.modelformset_factory(Child, ChildForm, exclude=[], extra=0)
然后在视图中,可以传递表单中所需的所有对象的查询集
# views.py
from .forms import ChildFormset
@login_required
def page_view(request, parent_pk):
parent = get_object_or_404(Parent, pk=pk)
child_queryset = parent.child_set.all()
if request.method == 'GET':
child_formset = ChildFormset(queryset=child_queryset)
return render(request, 'parent_view.html', {
'parent': parent,
'my_formset': child_formset,
})
else:
child_formset = ChildFormset(request.POST, queryset=child_queryset)
if child_formset.is_valid():
for form in child_formset:
form.save()
# ... Do whatever else you want to do with the data
在模板中,您必须遍历表单集中的所有表单对象。然后你可以用你想要的任何方式显示它们
# parent_view.html
{{ child_formset.management_form }}
{% for form in child_formset %}
<div class="hidden">{{ form.id }}</div>
{% for field in form.visible_fields %}
{{ field }}
{% endfor %}
{% endfor %}
注意:外键字段将显示为下拉列表,供用户从父对象列表中选择父对象。如果有多个子实例,则单个表单将没有多大用处,您必须使用表单集模型表单集才能精确 根据文件, 表单集是一个抽象层,用于在同一页面上处理多个表单
# forms.py
# You can provide a text area widget for the field that you want to be displayed as a text area
class MyForm(ModelForm):
class Meta:
model = Child
fields = () # fields go here
widgets = {
'field_name': forms.Textarea(attrs={'cols': 80, 'rows': 3}),
}
ChildFormset = forms.modelformset_factory(Child, ChildForm, exclude=[], extra=0)
然后在视图中,可以传递表单中所需的所有对象的查询集
# views.py
from .forms import ChildFormset
@login_required
def page_view(request, parent_pk):
parent = get_object_or_404(Parent, pk=pk)
child_queryset = parent.child_set.all()
if request.method == 'GET':
child_formset = ChildFormset(queryset=child_queryset)
return render(request, 'parent_view.html', {
'parent': parent,
'my_formset': child_formset,
})
else:
child_formset = ChildFormset(request.POST, queryset=child_queryset)
if child_formset.is_valid():
for form in child_formset:
form.save()
# ... Do whatever else you want to do with the data
在模板中,您必须遍历表单集中的所有表单对象。然后你可以用你想要的任何方式显示它们
# parent_view.html
{{ child_formset.management_form }}
{% for form in child_formset %}
<div class="hidden">{{ form.id }}</div>
{% for field in form.visible_fields %}
{{ field }}
{% endfor %}
{% endfor %}
注意:外键字段将显示为下拉列表,供用户从父对象列表中选择父对象。parent.child\u设置了什么。child_set.all似乎不是django模型属性,并抛出错误。如果您想从子对象访问父对象,可以很容易地使用“.”运算符。但如果您希望从父级访问子级,则称为反向外键关系,因为您正在反向遍历。为此,需要使用child_set来获取所有以parent作为外键的对象。如果您在定义外键的模型中提供了相关名称,那么您将使用parent.related\u name.allIt,而不是使用child\u set,而是使用parent.related\u name.allIt在模板中打印表单和解决方案,而不是使用key中的值,value作为字段的值,它使用子级的pk作为字段的值,也来自management from,它不显示任何下拉列表,而是打印出此表单:表单集使用管理表单来管理表单集中包含的表单集合。因此,您所显示的正是管理表单所做的。下拉列表将显示窗体中的外键。此外,我正在编辑答案,以便将form.id作为一个单独的字段,而不是所有其他字段。也许这会有帮助。parent.child\u设置了什么。child_set.all似乎不是django模型属性,并抛出错误。如果您想从子对象访问父对象,可以很容易地使用“.”运算符。但如果您希望从父级访问子级,则称为反向外键关系,因为您正在反向遍历。为此,需要使用child_set来获取所有以parent作为外键的对象。如果您在定义外键的模型中提供了相关名称,那么您将使用parent.related\u name.allIt,而不是使用child\u set,而是使用parent.related\u name.allIt在模板中打印表单和解决方案,而不是使用key中的值,value作为字段的值,它使用子级的pk作为字段的值,也来自management from,它不显示任何下拉列表,而是打印出此表单:表单集使用管理表单来管理表单集中包含的表单集合。因此,您所显示的正是管理表单所做的。下拉列表将显示窗体中的外键。此外,我正在编辑答案,以便将form.id作为一个单独的字段,而不是所有其他字段。也许这会有所帮助