Django:检查Djangoadmin表单中的数据

2024-05-23 19:02:19 发布

您现在位置:Python中文网/ 问答频道 /正文

您好,我有2个模型的视觉和视觉,问题是,我想进行验证,将提交的形式只在某些规则。我只想有一个图片是_front==True,如果有多个或没有一个图片抛出错误,则对表单进行验证

如果我

print(len(images.filter(is_front=True)))它将向我显示不是表单中的数据而是数据库中的数据(这是正常的)如何检查表单中的数据?在

在模型.py在

class Sight(models.Model): 
       name=Charfield(...)
       description=Charfield(...)
       ...

class SightPicture(models.Model): 
       sight=ForeignKey(Sight)
       picture=ImageField(...)
       is_front=BooleanField

在管理员py在

^{pr2}$

Tags: 数据py模型true表单modelismodels
2条回答

您可以重写ModelAdmin的clean方法:

from django import forms
class SightAdmin(admin.ModelAdmin):

     class Meta:
        model = Sight
        inlines = [SightPicInline, ...., ....]
     def clean(self):
        if Sight.objects.filter(is_front=self.cleaned_data.get("is_front")).exists():    
             raise forms.ValidationError("You can at max select one image as front")
        #more validations here
        return self.cleaned_data

由于内联模型数据在self.cleaned_data中不可用,您可以尝试从self.data属性访问内联模型数据,为Sightmodel admin添加一个表单,并在model admin form=SightForm中指定form类

from django import forms

SightForm(forms.ModelForm):
    def clean(self):
        start=self.data['sight_sightpicture-INITIAL_FORMS']
        end=self.data['sight_sightpicture-TOTAL_FORMS']
        front_images_count=0
        for i in range(start,end):
            is_front=self.data['sight_sightpicture-{}-is_front'.format(i)]
            if is_front:
                front_images_count+=1
            if front_images_count>1:
                raise forms.ValidationError("Error message here")
            return self.cleaned_data

相关问题 更多 >