我正在使用这些模型:

class Person(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(max_length=100)
    name_in_bangla = models.CharField(max_length=100)
    nick_name = models.CharField(max_length=30)
    birth_date = models.DateField()
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        related_name='member_persons')

    class Meta:
        ordering = ['name']
        unique_together = ['name', 'birth_date']

我的看法:
class PersonCreate(SuccessMessageMixin,CreateView):
    model = Person
    form_class = MemberForm
    success_message = "%(name)s was added as %(category)s successfully."

    def get_form(self, form_class=None):
        form = super().get_form(form_class)
        form.request = self.request
        return form

我的看法:
class MemberForm(ModelForm):

    class Meta:
        model = Person
        exclude =('user',)

    def clean(self):
        user = get_user(self.request)
        name = self.cleaned_data.get('name')
        birth_date = self.cleaned_data.get('birth_date')
        if self.instance.id:
            if Person.objects.filter(user=user).exclude(id=self.instance.id).exists():
                self.add_error('name', "You already submitted data")
            elif Person.objects.filter(name=name, birth_date=birth_date).exclude(id=self.instance.id).exists():
                self.add_error('name', "Person with this Name and Birth date already exists.")
        else:
            if Person.objects.filter(user=user).exists():
                self.add_error('name', "You already submitted data")
            elif Person.objects.filter(name=name, birth_date=birth_date).exists():
                self.add_error('name', "Person with this Name and Birth date already exists.")
        return self.cleaned_data

    def save(self, commit=True):
        person = super().save(commit=False)
        if not person.pk:
            person.user = get_user(self.request)
        if commit:
            person.save()
            self.save_m2m()
        return person

它适用于不同的人。但是,当我尝试对人使用相同的名称但生日不同时,它会给出MultipleObjectReturn并带有“get()返回了不止一个Person-它返回了2!”。

但是我使用了unique_together = ['name','birth_date']约束,并且使用了clean方法来捕获表单中的约束错误。但是我的表单没有捕获MultipleObjectReturned错误。

如何在表单中捕获这些错误?我的代码做错了什么。任何 body 的建议将不胜感激。

我的其他意见:
class PersonDetailView(generic.DetailView):

    queryset = (
         Person.objects.all()
        .prefetch_related('child_set')
         # below omitted because of with tag
        # and conditional display based on time
        # .prefetch_related('blog_posts')
     )
class PersonUpdate(SuccessMessageMixin,UpdateView):

    model = Person
    form_class = MemberForm
    success_message = "%(category)s: %(name)s was updated successfully."

    def get_form(self, form_class=None):
        form = super().get_form(form_class)
        form.request = self.request
        return form


@require_authenticated_permission(
'member.delete_person')
class PersonDelete(DeleteView):
    model = Person
    success_url = '/allmember/'

    success_message = "%(category)s: %(name)s was deleted successfully."


    def delete(self, request, *args, **kwargs):
        messages.success(self.request, self.success_message)
        return super(PersonDelete, self).delete(request, *args, **kwargs)

最佳答案

看来您有两个拥有相同子弹的用户。如果您的网址(未显示)是/person/<slug>/,那么您需要为slug字段设置unique=True

10-02 06:46