django - как зарегистрироваться в чистом методе формы, является ли это вставкой или обновлением

У меня есть форма, где я проверяю в чистом методе, существует ли объект 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

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

7
задан Thomas Kremmel 22 January 2010 в 16:20
поделиться

1 ответ

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

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, но, надеюсь, этот небольшой фрагмент дал вам некоторое представление о том, как вы можете выполнить свою задачу без дублирования форм.

5
ответ дан 6 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: