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
私はこれと一緒に遊ぶ必要があると思う:https://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects。私はそれを働かせることができるかどうか確認するためにそれをチェックします。ありがとう~~ – thedeepfield
これは、フォーム検証ではなくモデル検証です。モデルのinner-metaクラスに 'unique_together'を指定しているため、例外が発生しているのはフォームとは関係がなく、フォームエラーがない理由です。フォームエラーを導入する場合は、 'ModelForm'で表されるインスタンスを保存する際に例外をキャッチして手動でフォームに挿入する必要があります。 –
@pastylegs、odpogn、モデルクリーニングは機能するはずです。エラーが発生するDB –