【问题标题】:Django forms stop form processing on ValidationErrorDjango 表单在 ValidationError 上停止表单处理
【发布时间】:2021-10-02 14:01:04
【问题描述】:

我正在设计一个带有 recaptcha 和自定义地址字段清理方法的 Django 表单。

我想在第一个 ValidationError 上停止表单处理,换句话说,如果 recaptcha 不好,我不想执行 clean_address 方法。

对于recaptcha,我使用django-recaptcha

我的表格:

from django import forms
from captcha.fields import ReCaptchaField

from .models import Server, Category
from .utils.status_manager import ServerStatus


class AddServerForm(forms.ModelForm):
    captcha = ReCaptchaField()
    categories = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple(attrs={'class': 'checkbox'}),
                                           error_messages={
                                               'required': 'You need to select server type'
                                           },
                                           choices=[(c.pk, c.name) for c in Category.objects.all()]
                                           )

    def clean_address(self):
        address = self.cleaned_data['address']
        server = Server.objects.filter(address=address).exists()
        if server:
            raise forms.ValidationError("Server is on the list")
        if not ServerStatus(address).is_server_on():
            raise forms.ValidationError("Server is offline")
        return address

    class Meta:
        model = Server
        fields = ['address']

查看:

class AddServer(LoginRequiredMixin, FormView):

    template_name = 'add_server.html'
    login_url = '/users/discord/login'
    form_class = AddServerForm

    def form_invalid(self, form):
        errors = get_form_errors(form)
        for error in errors:
            messages.add_message(self.request, messages.ERROR, error)
        return super(AddServer, self).form_invalid(form)

    def form_valid(self, form):
        server = form.save()
        self.success_url = f'/servers/{server.id}'
        return super(AddServer, self).form_valid(form)

目前在 ValidationError 或如果 recaptcha 是错误的形式仍在处理中。

【问题讨论】:

    标签: python django forms django-forms


    【解决方案1】:

    您有方法def clean_address(self):,但尚未在顶部添加address 字段

    您的表单不会在数据库中save,如果您以这种方式进行验证,即使它也不会进行进一步处理:

    def clean_captcha(self, value):
        ##write some validation logic and raise error
        return value
    

    要验证所有字段,请使用以下方法:

    def clean(self, data):
        ...
    

    https://docs.djangoproject.com/en/3.2/ref/forms/validation/#form-field-default-cleaning

    【讨论】:

    • 我不需要在顶部添加地址字段,因为它是 ModelForm。在干净的方法中提高 ValidationError 不会停止表单处理。
    猜你喜欢
    • 2016-03-18
    • 2018-11-10
    • 1970-01-01
    • 2010-09-25
    • 2015-07-04
    • 1970-01-01
    • 2012-02-19
    • 2018-01-07
    • 2018-10-01
    相关资源
    最近更新 更多