Django: Проверьте данные в форме администратора Django - PullRequest
0 голосов
/ 18 марта 2019

Здравствуйте, у меня есть 2 модели Sight и SightPic, проблема в том, что я хочу сделать проверку, которая будет отправлять форму только в определенных правилах.Я хочу, чтобы только одна картинка была is_front == True, и сделайте проверку формы, если есть более одного или ни одного, чтобы выдать ошибку

В Моей чистой функции, если I

print(len(images.filter(is_front=True))) Появятся данные, которые представляют собой не данные в форме, а данные в базе данных (что является нормальным). Как я могу проверить данные в форме?

models.py

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

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

Admin.py

class SightPicInline(admin.TabularInline):
        model = SightPicture
        fields = ("image_tag", "picture", "is_front")
        readonly_fields = ("image_tag",)

class SightAdmin(admin.ModelAdmin):
        model = Sight
        inlines = [SightPicInline, ...., ....]




admin.site.register(Sight, SightAdmin)

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

, поскольку данные встроенных моделей недоступны в self.cleaned_data, вы можете попробовать получить доступ к данным встроенных моделей из свойства self.data, добавить форму для Sight администратора модели и указать класс формы в Model Admin form=SightForm

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
0 голосов
/ 18 марта 2019

Вы можете переопределить метод очистки для ModelAdmin:

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
...