我对django还是个新手,但是我已经安装了django-profiles和django-registration,并且运行了最新的django 1.5.1。我也读了一些指南,即http://dmitko.ru/django-registration-form-custom-field/, http://birdhouse.org/blog/2009/06/27/django-profiles/, Django-Registration &;Django-Profile,使用自定义表单
我没有自定义django-registration,但我试着让我自己的profiles类看起来像这样:
from django.contrib.auth.models import User
class UsrProfile(models.Model):
user = models.ForeignKey(User, unique=True, primary_key=True)
...custom fields here...
但我明白,有可能让用户注册,但它是一个单独的事情有配置文件,在用户可以注册而不必创建一个配置文件。
我的问题是,我怎么能坚持在配置文件类我做,进入注册?我想强制用户在注册时填写我在profiles类中指定的详细信息…
我试着遵循一些教程/指南在这里和那里,但我也一直卡住每当他们说修改url .py的东西:
url(r'^accounts/register/$',
register,
{'backend': ... form_class...
),
因为每当我尝试这个,"寄存器"(在第二行)似乎没有被识别,我不知道它指的是什么....我尝试这样做:
from registration.views import register
您可以扩展类user,并使用您想要的信息创建表单。
for extend User:models.py
User.add_to_class('phone', models.CharField(max_length=12))
User.add_to_class('books', models.ManyToManyField(Func,null=True,blank=True))
Form.py
class AddUserForm(forms.Form):
username = forms.CharField(label="Rut",widget=forms.TextInput())
email = forms.EmailField(label="Correo Electronico",widget=forms.TextInput())
password = forms.CharField(label="Password",widget=forms.PasswordInput(render_value=False))
phone = forms.CharField(label="Telefono",widget=forms.TextInput())
books = forms.ModelMultipleChoiceField(queryset=Book.objects.all(),label='Books')
def clean_username(self):
username = self.cleaned_data['username']
try:
u = User.objects.get(username=username)
except User.DoesNotExist:
return username
raise forms.ValidationError('Username is ready')
def clean_email(self):
email = self.cleaned_data['email']
try:
u = User.objects.get(email=email)
except User.DoesNotExist:
return email
raise forms.ValidationError('Email is ready')
view.py
def registerUser(request):
form = AddUserForm()
if request.method == "POST":
form = AddUserForm(request.POST)
if form.is_valid():
username = form.cleaned_data['username']
email = form.cleaned_data['email']
password = form.cleaned_data['password']
u = User.objects.create_user(username=username,email=email,password=password)
u.phone = form.cleaned_data['phone']
u.books = form.cleaned_data['books']
u.save()
return HttpResponseRedirect('/users/')
else:
ctx = {'form':form}
return render_to_response('register.html',ctx,context_instance=RequestContext(request))
ctx = {'form':form}
return render_to_response('register.html',ctx,context_instance=RequestContext(request))
解决方案:
在自定义url.py
中from registration.backends.default.views import RegistrationView
url(r'^register/$',
RegistrationView.as_view(form_class=YourCustomForm),
name='registration_register'),
),
代替:
from registration.views import register
url(r'^accounts/register/$',
register,
{'backend': ... form_class...
),
论述:
查看文档。
'form_class'参数:
"用于用户注册的表单类。可以在每个请求的基础上重写吗(见下面的>)。应该是实际的类对象。"
所以'YourCustomForm'是一个从RegistrationForm类扩展而来的表单,像这样:
class UserRegistrationForm(RegistrationForm):
lastname = forms.CharField(widget=forms.TextInput(attrs=attrs_dict))
...