2012-03-20 38 views
0

フォームエラーを表示するのではなく、「例外値:列project_id、employee_idが一意ではありません」というエラーページが表示されます。代わりにフォームエラーを表示するにはどうしたらいいですか? (のようなものを示さなければならない:プロジェクトと従業員の組み合わせは、すでに「会員に存在する)DJANGO:フォームに検証エラーが表示されない

MODELS:

class Project(models.Model): 
    projecttype = models.ForeignKey(Projecttype) 
    department = models.ForeignKey(Department) 
    members = models.ManyToManyField(Employee, through='Membership') 
    def __unicode__(self): 
     return self.projecttype.name 

class Membership(models.Model): 
    project = models.ForeignKey(Project) 
    department = models.ForeignKey(Department) 
    employee = models.ForeignKey(Employee) 
    role = models.ManyToManyField(Role, blank=True, null=True) 
    class Meta: 
     unique_together = (("program", "employee",),) 

VIEW:

def employee_edit(request, employee_id): 
    i = get_object_or_404(Employee, pk=employee_id) 
    MembershipForm = make_membership_form(i) 
    MembershipFormSet = modelformset_factory(Membership, form=MembershipForm) 
    f = MembershipFormSet(queryset=Membership.objects.filter(employee=i),) 
    if request.method == "POST": 
     f = MembershipFormSet(request.POST) 
     m = f.save(commit=False) 
     for instances in m: 
      instances.employee = i 
      instances.department = i.department 
     if f.is_valid(): 
      instances.save() 
      f.save_m2m() 
    return render_to_response('testdb/edit.html', {'item': i, 'formset': f, }, context_instance=RequestContext(request)) 

def make_membership_form(i): 
    class MembershipForm(forms.ModelForm): 
     project = forms.ModelChoiceField(queryset=Project.objects.filter(department=i.department)) 
     class Meta: 
      model = Membership 
      exclude = ('department', 'employee') 
      unique_together = (("project", "employee",),) 
    return MembershipForm 

答えて

0

をあなたはにsave呼び出しでスローされる例外をキャッチすることができますフォームとinject a custom errorを返す前にフォームに入力します。このようなもの(非常にテスト済み):

from django.db import IntegrityException 
... 
formset = MembershipFormSet(request.POST) 
for form in formset: 
    try: 
     form.save(commit=False) 
    catch IntegrityException: 
     errors = form._errors.setdefault("field", ErrorList()) 
     errors.append(u"error") 
+0

私はこれと一緒に遊ぶ必要があると思う:https://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects。私はそれを働かせることができるかどうか確認するためにそれをチェックします。ありがとう~~ – thedeepfield

+0

これは、フォーム検証ではなくモデル検証です。モデルのinner-metaクラスに 'unique_together'を指定しているため、例外が発生しているのはフォームとは関係がなく、フォームエラーがない理由です。フォームエラーを導入する場合は、 'ModelForm'で表されるインスタンスを保存する際に例外をキャッチして手動でフォームに挿入する必要があります。 –

+0

@pastylegs、odpogn、モデルクリーニングは機能するはずです。エラーが発生するDB –

関連する問題