DJANGO: ошибка проверки не отображается в форме - PullRequest
0 голосов
/ 21 марта 2012

Вместо отображения ошибок формы я получаю страницу с сообщением об ошибке «Значение исключения: столбцы project_id, employee_id не являются уникальными».Как я могу получить ошибки формы, чтобы показать вместо этого?(должно отображаться что-то вроде: комбинация проекта и сотрудника уже существует в членстве ")

МОДЕЛИ:

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",),)

ПРОСМОТР:

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

1 Ответ

0 голосов
/ 21 марта 2012

Вы можете перехватывать исключения, возникающие при вызове save формы, и вставлять пользовательскую ошибку в форму перед ее возвратом. Примерно так (очень непроверено):

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...