Django模型表单集不包含POST数据



我有以下型号的

型号.py

class Activity(Model):
user = ForeignKey(settings.AUTH_USER_MODEL, on_delete=CASCADE)
activity = CharField(max_length=100, default='')
number = IntegerField(default=1)

以及以下模型

forms.py

class ActivityForm(ModelForm):
class Meta:
model = Activity
fields = ['activity']

制成视图中的模型集

views.py

activities = Activity.objects.filter(user=request.user)
ActivityFormSet = modelformset_factory(Activity, form=ActivityForm)
formset = ActivityFormSet(queryset=activities)
if request.method == 'POST':
if 'save' in request.POST:
formset = ActivityFormSet(request.POST)
if formset.is_valid():

我的视野到此为止。因为formset无效,formset.errors给了我:

[{'activity': ['This field is required.'], 'id': ['This field is required.']}, {}] 

来自我的模板:

<form enctype="multipart/form-data" method = "POST">
{% csrf_token %}
{{ formset.management_form }}
{% for hidden in formset.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for activity in activities %} 
<div class="expandable-input-small" id="input_activity{{ activity.number }}" contenteditable="true"></div>
<div id="form_activity{{ activity.number }}">{% for hidden in formset.form.hidden_fields %}{{ hidden }}{% endfor %}{{ formset.form.activity.as_hidden }}</div>
{% endfor %}
<button name="save" class="btn btn-primary" type = "submit" value = "Click" onclick="get_data()">Save</button>
</form>

在使用函数get_data((提交之前,我使用javascript将数据从contenteditable传输到隐藏的formset表单字段。我已经测试并确认了这个函数的工作原理,方法是在表单外调用它,并将输入字段设置为不隐藏。

无论我做什么,即使我取消隐藏字段并手动输入数据,表单集似乎也不包含任何发布数据。我曾尝试使用文档来理解这一点,但大多数示例(出于某种原因(都取自控制台命令,而不是在模板中显示表单集。

我做错了什么?我该如何解决这个问题?

使用此行

{% for activity in activities %} 

您正在循环进行各种活动。但是,您并没有在表单集中循环浏览表单。所以,

{{ formset.form.activity.as_hidden }}

每次都创建相同的字段,导致POST 中缺少字段

试试之类的东西

<form enctype="multipart/form-data" method = "POST">
{% csrf_token %}
{{ formset.management_form }}
{% for activity in activities %} 
<div class="expandable-input-small" id="input_activity{{ activity.number }}" contenteditable="true">
</div>
<div id="form_activity{{ activity.number }}">
{% for form in formset %}
{% if forloop.counter == forloop.parentloop.counter %}
{{ form.activity.as_hidden }}
{{ form.id.as_hidden}}
{%endif%}
{% endfor %}
</div>
{% endfor %}
<button name="save" class="btn btn-primary" type = "submit" value = "Click" onclick="get_data()">Save</button>
</form>

它应该为您提供每个活动所需的字段(通过计数将表单集循环与活动循环相匹配(。通常,对于表单集表单,隐藏ID是自动提供的,但在这里,希望将其显式创建为_hidden可以完成这项工作。

最新更新