Как проверить валидацию по двум полям в форме?

#django #django-views #django-forms #django-urls #django-validation

#django #django-просмотры #django-forms #django-urls #django-валидация

Вопрос:

Необходимо добавить изображение в форму либо путем ввода ссылки на изображение, либо загрузить файл со своего компьютера. Если при отправке формы не было введено никаких параметров или были введены оба параметра, должно появиться сообщение об ошибке. И после успешной загрузки вы должны попасть на страницу изображения.

models.py:

 class Picture(models.Model):
    url = models.URLField(blank=True, verbose_name='Ссылка на изображение')
    image = models.ImageField(upload_to='pictures/%Y/%m/%d', width_field='image_width', height_field='image_height',
                              blank=True, verbose_name='Изображение')
    image_width = models.IntegerField(default=0, blank=True, verbose_name='Ширина изображения')
    image_height = models.IntegerField(default=0, blank=True, verbose_name='Высота изображения')
    is_active = models.BooleanField(default=True, verbose_name='Актуальность изображения')
    created = models.DateField(blank=True, null=True, default=timezone.now, verbose_name='Дата создания записи')
    updated = models.DateField(blank=True, null=True, default=timezone.now, verbose_name='Дата ред-ия записи')
 

views.py:

 def add_picture(request):
    picture = Picture.objects.filter(is_active=True)
    if request.method == 'POST':
        form = PictureCreateForm(data=request.POST, files=request.FILES)
        if form.is_valid():
            form.save()
            return render(request, 'add_picture.html', locals())
        else:
            messages.error(request, 'Ошибка, проверьте данные')
    else:
        form = PictureCreateForm()

    return render(request, 'add_picture.html', locals())
 

forms.py : Здесь вам нужно определить метод clean

 class PictureCreateForm(forms.ModelForm):
    class Meta:
        model = Picture
        fields = ('url', 'image')

def clean(self):

    cd = self.cleaned_data
    if cd['url'] and cd['image']:
        raise forms.ValidationError('Ошибка!')
    if not cd['url'] and not cd['image']:
        raise forms.ValidationError('Ошибка!')
    return cd
 

urls.py:

 urlpatterns = [
    path('', views.home, name='home'),
    path('add_picture/', views.add_picture, name='add_picture'),
    path('picture_detail/<int:id>/', views.picture_detail, name='picture_detail'),
]
 

Ответ №1:

Вы можете использовать clean(...) метод forms.ModelForm as

 class PictureCreateForm(forms.ModelForm):
    class Meta:
        model = Picture
        fields = ('url', 'image')

    def clean(self):
        cleaned_data = super().clean()
        url = cleaned_data.get("url")
        image = cleaned_data.get("url")

        # do your logic here
        # atlast
        return cleaned_data 

Комментарии:

1. Условие, при котором поле не вводится, работает. Но что, если введены два поля?

2. Поскольку clean() метод url image одновременно дает вам значение и, вы можете сделать все остальное, не так ли?

3. Я не могу создать условие, при котором два поля остаются пустыми. В это время вам нужно выдать сообщение об ошибке. То есть, если url и изображение остаются пустыми, тогда вам нужно вызвать сообщение об ошибке.

4. Разобрался! Спасибо за ваше время ^^