Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用django中基于关系的键值创建表单_Python_Django_Django Forms - Fatal编程技术网

Python 使用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:

我有一个基于django的应用程序,我想从模型中创建一个键、值对的表单。“子”模型由以下数据行组成:

(<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作为一个单独的字段,而不是所有其他字段。也许这会有所帮助