我正在为成员资格模型(模型auth.User成员身份到app.Project)的模型formset上工作。这里的应用程序/ forms.py,我评论出来后修整的事情,我已经证实是不相关的后:Django ValidationError自定义模型formset与自定义字段(数据缺失或已被篡改)
class EditMembership(forms.ModelForm):
delete = forms.BooleanField(required=False, initial=False)
class Meta:
model = models.Membership
fields = ('is_owner',)
def clean_delete(self):
return self.cleaned_data['delete']
class BaseEditMemberships(forms.models.BaseModelFormSet):
# Some custom methods not dealing with validation.
pass
EditMembershipSet = forms.models.modelformset_factory(models.Membership,
form=EditMembership, extra=0, formset=BaseEditMemberships)
这里是我的模板:
<form method="{{ method|default:"post" }}" action="{{ action }}">
{% csrf_token %}
<ul>
{% for form in formset %}
<li>{{ form.instance.user}}</li>
{{ form.as_ul }}
{% endfor %}
</ul>
<input type="submit" value="{{ submit_value|default:"Submit" }}" />
</form>
而我的观点:
@ownership_required(message="You must be an owner to edit memberships.")
def edit_memberships(request, pk):
project = get_object_or_404(models.Project, pk=pk)
if request.method == "GET":
formset = forms.EditMembershipSet(
queryset=project.membership_set.all()
)
return render_formset_fullpage(request, formset, "Edit Memberships",
template=forms.EDITMEMBERSHIPS_PATH)
elif request.method == "POST":
formset = forms.EditMembershipSet(request.POST)
return HttpResponse("Hooray!")
以及相关型号:
class Membership(models.Model):
class Meta:
unique_together = ('project', 'user')
project = models.ForeignKey('common.Project', editable=False)
user = models.ForeignKey('auth.User')
is_owner = models.BooleanField(default=False, blank=False,
help_text="Indicates ownership of the project")
project_alias = models.CharField(max_length=CHARFIELD_SHORT,
help_text="User-given name", blank=True)
问题是我一直在做POST后得到一个ValidationError回:
ValidationError at /project/4/memberships
[u'ManagementForm data is missing or has been tampered with']
从我可以告诉,forms.EditMembership做的不错。我可以渲染该表单并从POST重新创建它,但没有验证错误,所以我猜这是我使用BaseEditMemberships/EditMembershipSet的方式。
编辑:
只给你更多的信息,下面是它产生的示例形式和POST变量为我的测试请求之一。形式:
<form method="post" action="">
<div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='d6d535efd35e83076e1ac14a82ef4cdc' /></div>
<ul>
<li>someuser</li>
<li><label for="id_form-0-is_owner">Is owner:</label>
<input checked="checked" type="checkbox" name="form-0-is_owner" id="id_form-0-is_owner" />
</li>
<li><label for="id_form-0-delete">Delete:</label>
<input type="checkbox" name="form-0-delete" id="id_form-0-delete" />
<input type="hidden" name="form-0-id" value="8" id="id_form-0-id" />
</li>
</ul>
<input type="submit" value="Submit" />
</form>
相应的POST变量,如果我检查删除框:
- 形式-0-ID:u'8'
- csrfmiddlewaretoken:u'd6d535efd35e83076e1ac14a82ef4cdc”
- 形式 - 0-删除:u'on '
- 形式-0-is_owner:u'on'
谢谢,这固定了它! – OEP 2013-02-21 18:20:50