Max*_*xim 4 python django django-signals django-admin django-validation
我正在尝试验证 MyModel 和 Item 的变量 foo 是否相同,然后再将其添加为 m2m。如果不是,我想在管理员中提出 ValidationError 。
模型.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)
Run Code Online (Sandbox Code Playgroud)
信号.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"]})
Run Code Online (Sandbox Code Playgroud)
有没有办法让 ValidationError 在管理员中正确显示,而不是显示为 500 错误。
我无法想出一个解决方案来使用 MyModel 的 clean 方法来验证 foo 的相同值。任何建议表示赞赏。
使用方法创建一个form类clean并修改您的管理类以使用该表单。读这个:
喜欢:
@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"]})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1746 次 |
| 最近记录: |