【问题标题】:Showing validation error from m2m_changed signal in django admin在 django admin 中显示来自 m2m_changed 信号的验证错误
【发布时间】:2023-03-10 17:15:02
【问题描述】:

在将变量 foo 添加为 m2m 之前,我正在尝试验证变量 foo 对于 MyModel 和 Item 是否相同。如果不是,我想在管理员中引发 ValidationError。

models.py

class Item(models.Model):
    foo = models.CharField(max_length=200)    

class MyModel(models.Model):
    foo = models.CharField(max_length=200)
    items = models.ManyToManyField(Item)

信号.py

@receiver(m2m_changed, sender=MyModel.items.through)
def my_validator(sender, instance, action, pk_set, **kwargs):
    if action == 'pre_add':
        if Item.objects.filter(id__in=pk_set, foo=instance.foo).count() != len(pk_set):
            raise ValidationError({'items': ["Foo doesn't match"]})

有没有办法让 ValidationError 在管理员中正确显示,而不是 500 错误。

我无法想出一个解决方案来使用 MyModel 的 clean 方法来验证 foo 的相同值。任何建议表示赞赏。

【问题讨论】:

    标签: python django django-admin django-signals django-validation


    【解决方案1】:

    使用clean 方法创建一个form 类,并修改您的管理类以使用该表单。阅读this

    喜欢:

    @admin.register(MyModel)
    class MyModelAdmin(admin.ModelAdmin):
        search_fields = ('foo', 'items__foo')
        list_display = ('foo', 'items__foo')
        form = MyModelForm
    
    
    class MyModelForm(forms.ModelForm):
    
        def clean(self):
            """
            This is the function that can be used to 
            validate your model data from admin
            """
            super(MyModelForm, self).clean()
            foo = self.cleaned_data.get('foo')
            pk_set = Item.objects.all().values_list("id")
    
            # The logic you were trying to filter..
            if Item.objects.filter(id__in=pk_set).count() != len(pk_set):
                raise ValidationError({'items': ["Foo doesn't match"]})
    

    【讨论】:

    • 谢谢!创建一个 ModelForm 并通过那里验证它就可以了。但是,我确实将 pk_set 设置为 self.cleaned_data.get("items") 。不确定您为什么使用 Item.objects.all()。再次感谢!!
    • @Maxim 我不知道你想要保存和使用的 pk_set 到底是什么,所以我想,它应该是 Item 表的 pk 值等等 Item.object.all() 。无论如何,不​​客气。:)
    • 不用担心,实际的验证逻辑并不真正相关。我非常感谢你的帮助。为我节省了大量时间!干杯
    猜你喜欢
    • 2013-09-05
    • 2012-07-26
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2012-09-23
    • 2018-11-10
    • 2018-11-23
    • 2019-07-01
    相关资源
    最近更新 更多