django - как проверить в чистом методе формы, является ли это вставкой или обновлением - PullRequest
7 голосов
/ 22 января 2010

У меня есть форма, в которой я проверяю в чистом методе, существует ли уже объект ProjectMembership, который имеет одинаковые значения для проекта и члена. Это связано с тем, что в модели ProjectMembership я определил ограничение unique_together для проекта и участника. Это прекрасно работает на самом деле.

class ProjectMembershipForm(forms.ModelForm):

    project = forms.ModelChoiceField(Project.objects, widget=HiddenInput())

    class Meta:
        model = ProjectMembership

    def clean(self):
        cleaned_data = self.cleaned_data

        project = cleaned_data.get("project")
        member = cleaned_data.get("member")

        print ProjectMembership.objects.filter(project=project, member=member).count()
        if ProjectMembership.objects.filter(project=project, member=member).count() > 0:
            del cleaned_data["project"]
            del cleaned_data["member"]
            raise forms.ValidationError('The user "%s" is already part of the project team for project "%s".' % (member, project))
        return cleaned_data

Но теперь я спрашиваю себя, как я могу в чистом методе судить, пытается ли пользователь создать новые отношения или обновить отношения. Поскольку с этим чистым методом невозможно выполнить обновление, так как он возвращает сообщение об ошибке, что запись уже существует.

Ответы [ 2 ]

18 голосов
/ 13 декабря 2011

Попробуйте это:

if self.instance.pk:
   update_procedure()
else:
   insert_procedure()
5 голосов
/ 06 июля 2010

Вы можете попробовать изменить это:

if ProjectMembership.objects.filter(project=project, member=member).count() > 0:

примерно так:

if ProjectMembership.objects.filter(project=project, member=member).exclude(pk=self.instance.id).count() > 0:

на самом деле вам нужно проверить, не является ли self.instance значением None, прежде чем использовать его в exclude, но, надеюсь, этот небольшой фрагмент дал вам представление о том, как вы можете выполнить свою задачу, не дублируя формы.

...