2013-02-21 55 views
0

我正在为成员资格模型(模型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'

回答

相关问题