【发布时间】: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