gpt4 book ai didi

django 表单 is_valid 总是失败(扩展 django-registration 表单)

转载 作者:行者123 更新时间:2023-12-04 05:15:06 31 4
gpt4 key购买 nike

我正在尝试扩展 Django 注册以包含我自己的注册表单。原则上这是相当简单的。我只需要编写自己的表单( CustomRegistrationForm ),它是原始表单( RegistrationForm )的子节点。然后我可以通过使用 django 注册的 user_registered 信号来处理我的特定输入。

所以这就是我所做的:

urls.py:

from django.conf.urls import patterns, include, url
from registration.views import register
from forms import CustomRegistrationForm
from django.contrib import admin
import regbackend
admin.autodiscover()

urlpatterns = patterns('',
url(r'^register/$', register, {'backend': 'registration.backends.default.DefaultBackend', 'form_class': CustomRegistrationForm, 'template_name': 'custom_profile/registration_form.html'},
name='registration_register'),
)

regbackend.py:
from django import forms
from models import UserProfile
from forms import CustomRegistrationForm

def user_created(sender, user, request, **kwargs):
form = CustomRegistrationForm(data=request.POST, files=request.FILES)
if form.is_valid(): # HERE: always fails
user_profile = UserProfile()
user_profile.user = user
user_profile.matriculation_number = form.cleaned_data['matriculation_number']
user_profile.save()

from registration.signals import user_registered
user_registered.connect(user_created)

表单.py:
from models import UserProfile
from django import forms
from registration.forms import RegistrationForm
from django.utils.translation import ugettext_lazy as _

attrs_dict = {'class': 'required'}

class CustomRegistrationForm(RegistrationForm):
matriculation_number = forms.CharField(widget=forms.TextInput(attrs=attrs_dict),
label=_("Matriculation number"),
max_length=12,
error_messages={'invalid': _("This value has to be unique and may contain only numbers.")},
initial=108)

def clean_matriculation_number(self):
print "Validating matriculation number."
data = self.cleaned_data['matriculation_number']
if len(data) != 12:
raise forms.ValidationError(_("Matriculation number consists of exactly 12 digits."))
return data

所以问题是 is_valid()函数,因为它总是返回 False .即使没有错误!那么有什么问题呢?我花了几个小时在这个上,我已经不知道了:(

非常感谢任何帮助!!

最佳答案

原因form.is_valid()失败可能是因为表单的“clean_username”函数检查传递给它的用户名是否已经存在。由于在创建 User 对象并将其添加到数据库后发送信号,因此表单每次都无法通过此测试。我的猜测是如果您登录 form.cleaned_data之后 is_valid()返回 False ,您将获得除用户名之外的所有字段的列表。
form.data如果表单 clean_ 函数进行了任何更改,则可能不包含字段的更改值(我在 form.data 上找不到太多文档)。

为了避免这可能导致的潜在问题,我为我的自定义注册表单创建了两个类:

# I use this one for validating in my create_user_profile function
class MyRegistrationFormInternal(forms.Form):
# Just an example with only one field that holds a name
name = forms.CharField(initial="Your name", max_length=100)
def clean_name(self):
# (Optional) Change the name in some way, but do not check to see if it already exists
return self.cleaned_data['name'] + ' foo '
# This one is actually displayed
class MyRegistrationForm (MyRegistrationFormInternal):
# Here is where we check if the user already exists
def clean_name(self):
modified_name = super(MyRegistrationForm, self).clean_name()
# Check if a user with this name already exists
duplicate = (User.objects.filter(name=modified_name)
if duplicate.exists():
raise forms.ValidationError("A user with that name already exists.")
else:
return modified_name

然后,您可以通过 MyRegistrationFormInternal 运行您的 POST 数据,而不是使用 form.data(在某些方面可能仍然是“不干净的”)。 , 和 is_valid()不应该总是返回 false。

我意识到这不是最干净的解决方案,但它避免了必须使用(可能是原始的)form.data。

关于django 表单 is_valid 总是失败(扩展 django-registration 表单),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14386298/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com