【问题标题】:How to check validation on two fields in a form?如何检查表单中两个字段的验证?
【发布时间】:2021-04-05 21:11:03
【问题描述】:

需要通过输入图片的链接来向表单添加图片,上传文件 从您的计算机。 如果在提交表单时未输入任何选项或同时输入了两个选项,则应显示错误消息。加载成功后,应该会进入图片页面。

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'),
]

【问题讨论】:

    标签: django django-views django-forms django-urls django-validation


    【解决方案1】:

    你可以利用forms.ModelFormclean(...)方法作为

    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

    【讨论】:

    • 不输入字段的条件有效。但是如果输入两个字段呢?
    • 由于clean() 方法为您提供了urlimage同时你可以做剩下的,可以不是吗?
    • 我无法创建两个字段留空的条件。这时候,你需要提出一个错误。即如果 urlimage 为空,则需要调用错误信息。
    • 想通了!谢谢你的时间^^
    猜你喜欢
    • 2017-10-30
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多