django表单集无法验证,因为需要ID [英] django formset not validating because ID is required
问题描述
MY视图从模板接收到一个模型表单集,但未通过验证,声称需要ID。到目前为止,我对表单的使用从未提出过这个问题,而且我也从来不需要传递ID。
MY view receives a model formset from the template, but it doesn't pass validation, claiming that ID is required. Al my use of forms until now has never brought up this problem, and I've never had to pass ID's around.
这里是我的观点的简化版本:
Here is a simplified version of my view:
def BudgetView(request):
import pdb
pdb.set_trace()
if request.user.is_authenticated:
U=request.user
#initalize formset factories
ItemFormSet = modelformset_factory(Item, fields=(blabla), extra=0)
CatFormset=modelformset_factory(BudgetCatagory, fields=(blabla), extra=0)
#initalize Constants
InitiateConstants(CatagoryItemsList)
if request.method=='POST':
FormsetItem=ItemFormSet(request.POST,initial=Item.objects.filter(budgetcatagory__user_id=U.id).values())
FormsetCat=CatFormset(request.POST)
if FormsetItem.is_valid():
-bla
-bla
-bla
return redirect('/HighLevelInput')
else:
#populate
I=Item.objects.filter(budgetcatagory__user_id=U.id)
C=BudgetCatagory.objects.filter(user_id=U.id)
#initiate initial catagories and items for new user
if (not I.exists()) or (not C.exists()):
Item.objects.filter(budgetcatagory__user_id=U.id).delete()
BudgetCatagory.objects.filter(user_id=U.id).delete()
InitiateNewUser(U)
I=Item.objects.filter(budgetcatagory__user_id=U.id)
C=BudgetCatagory.objects.filter(user_id=U.id)
FormsetItem=ItemFormSet(queryset=I)
FormsetCat=CatFormset(queryset=C)
return render(request,'getdata/budgetmachine.html', {'FormsetItem':FormsetItem, 'FormsetCat':FormsetCat })
else:
return redirect('/login')
is_valid返回reaso为FALSE我上面已经提到过。
有什么想法吗?
is_valid returns FALSE for the reason I've mentioned above. any ideas?
根据要求,以下是is_valid检查返回的错误:
As requested, here are the errors returned from the is_valid check:
(Pdb) FormsetItem.errors
[{'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'name': ['This field is required.'], 'detail': ['This field is required.'], 'layout': ['This field is required.'], 'unit': ['This field is required.'], 'unit_description': ['This field is required.'], 'parent': ['This field is required.'], 'enName': ['This field is required.'], 'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'name': ['Ensure this value has at most 30 characters (it has 32).'], 'parent': ['Ensure this value has at most 30 characters (it has 32).'], 'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}, {'id': ['This field is required.']}]
在这里是我的模板:
{% block body %}
<div class="container" style="width:80%">
<form method="post">
{% csrf_token %}
{{ FormsetItem.management_form }}
{{ FormsetCat.management_form }}
<table>
<tr>
<th>פריט</th>
<th>מחיר מתוקצב</th>
<th>מיקום מחיר</th>
<th>רמת פירוט</th>
<th>רמת פירוט</th>
</tr>
<!--unpacks the item dictionary into formsets -->
{% for CatForm in FormsetCat %}
<tbody onmouseenter="ToggleDisable('{{ CatForm.enName.value}}')" onmouseleave="ToggleDisable('{{ CatForm.enName.value}}')">
{% for ItemForm in FormsetItem %}
{% if ItemForm.parent.value == CatForm.name.value %}
{% if ItemForm.layout.value == 'normal' %}
{% include 'getdata/normalBudgetLayout.html' with form=ItemForm itemCount=forloop.counter0 catagoryCount=forloop.parentloop.counter0 %}
{% elif ItemForm.layout.value == 'choice' %}
{% include 'getdata/choiceBudgetLayout.html' with form=ItemForm itemCount=forloop.counter0 catagoryCount=forloop.parentloop.counter0 %}
{% endif %}
{% endif %}
{% endfor %}
<tr class="txt_center Row_{{ CatForm.enName.value}}" style="line-height:4em; background:Silver;">
<td>
<a onclick="ToggleDisable('{{ CatForm.enName.value}}')">
{{ CatForm.name.value }}
<span style="float:left;">
<i class="fa fa-caret-down {{ CatForm.enName.value}}" style="font-size:30px; padding:7px;"></i>
<i class="fa fa-caret-up {{ CatForm.enName.value}}" style="font-size:30px; padding:7px;" hidden></i>
</span>
<!--/a-->
</td>
<td>{{ CatForm.catagory_cost }}</td>
<td>TBD</td>
<td>{{ CatForm.detail.value }}</td>
<td></td>
</tr>
</tbody>
{% endfor %}
</table>
<br />
<br />
<br />
<button type="submit" >Submit</button> <br />
<br />
</form>
</div>
{% endblock %}
Thx
推荐答案
ModelFormsets
需要 form.id
。它呈现为隐藏字段。您将需要同时使用两个表单集。
ModelFormsets
require form.id
. It is rendered as a hidden field. You will need to implement it with both formsets.
{% for form in formset %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
<!-- form.visible fields go here -->
{% endfor %}
这篇关于django表单集无法验证,因为需要ID的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!