我的模板如下:
<form method="post" action="">
{{ formset.management_form }}
{% for form in formset.forms %}
{{ form.contractor }} {{ form.date }} {{ form.value }} {{ form.comment }} {{ form.operation_type }} {{ form.category }} {{ form.account }}
{% endfor %}
</form>
但结果允许更改所有字段 - 但我只想要一个。
我认为(除了类别字段之外,请注意“.value”)解决问题,但不是。
<form method="post" action="">
{{ formset.management_form }}
{% for form in formset.forms %}
{{ form.contractor.value }} {{ form.date.value }} {{ form.value.value }} {{ form.comment.value }} {{ form.operation_type.value }} {{ form.category }} {{ form.account.value }}
{% endfor %}
</form>
UPD : 相关的观点代码
def detail(request, category_id):
from django.forms.models import modelformset_factory
OperationFormSet = modelformset_factory(Operation)
if request.method == "POST":
formset = OperationFormSet(request.POST, request.FILES,
queryset=Operation.objects.filter(category=category_id))
if formset.is_valid():
formset.save()
# Do something.
else:
formset = OperationFormSet(queryset=Operation.objects.filter(category=category_id))
return render_to_response("reports/operation_list.html", {
"formset": formset,
})
答案 0 :(得分:0)
您的问题是readonly值没有传递回服务器,因此您的formset会失败,因为它只接收一个字段。
您希望显示值并设置隐藏字段以存储formset所期望的数据。但我建议采用不同的方法......
最终,formset和form用于显示html表单,而不是为其他任何内容构建。你必须破解它以显示隐藏的小部件,确保用户不能POST任意数据等。相反,我会使用表单框架只显示你的一个可编辑字段。
创建一个只有一个可编辑字段的ModelForm
class MyModelForm(forms.ModelForm):
class Meta:
model = Operation
fields = ('category',)
MyModelFormSet = modelformset_factory(Operation, form=MyModelForm)
至于在模板中显示值,ModelForms应该可以通过form.instance
直接访问它们的实例,这样你就能做到这样的事情:
{% for form in formset %}
{{ form.instance.some_attribute }}
{{ form.category }}
{% endfor %}