一尘不染

Django注册和Django个人资料,使用你自己的自定义表单

django

我正在使用django-registrationdjango-profile来处理注册和配置文件。我想在注册时为用户创建一个配置文件。我创建了一个自定义注册表格,并使用以下教程将其添加到urls.py:

http://dewful.com/?p=70

本教程中的基本思想是覆盖默认注册表单以同时创建配置文件。

forms.py-在我的个人资料应用中

from django import forms
from registration.forms import RegistrationForm
from django.utils.translation import ugettext_lazy as _
from profiles.models import UserProfile
from registration.models import RegistrationProfile

attrs_dict = { 'class': 'required' }

class UserRegistrationForm(RegistrationForm):
    city = forms.CharField(widget=forms.TextInput(attrs=attrs_dict))

    def save(self, profile_callback=None):
        new_user = RegistrationProfile.objects.create_inactive_user(username=self.cleaned_data['username'],
        password=self.cleaned_data['password1'],
        email=self.cleaned_data['email'])
        new_profile = UserProfile(user=new_user, city=self.cleaned_data['city'])
        new_profile.save()
        return new_user

urls.py

from profiles.forms import UserRegistrationForm
和

url(r'^register/$',
                           register,
                           {'backend': 'registration.backends.default.DefaultBackend', 'form_class' : UserRegistrationForm},
                           name='registration_register'),

显示该表格,我可以输入城市,但是它不会保存或在数据库中创建该条目。


阅读 651

收藏
2020-03-26

共1个答案

一尘不染

你已经准备就绪,你已经成功构建了一个自定义表单,该表单将替换默认表单。但是,你尝试使用模型窗体上的save()方法进行自定义处理。这在旧版本的django-registration中是可能的,但是从你在URL conf中指定后端使用v0.8的事实可以看出。

该升级指南说:

以前,在注册期间用于收集数据的表单应该实现一个save()方法,该方法将创建新的用户帐户。这已不再是这种情况; 创建帐户由后端处理,因此任何自定义逻辑都应移至自定义后端,或将侦听器连接到注册过程中发送的信号。

换句话说,既然你使用的是0.8版,则窗体上的save()方法将被忽略。你需要使用自定义后端或信号进行自定义处理。我选择创建一个自定义后端(如果有人使用信号处理此功能,请发布代码-我无法使其正常工作)。你应该能够对其进行修改以保存到你的自定义配置文件。

  1. 在你的应用中创建一个regbackend.py。
  2. 将register()方法从DefaultBackend复制到其中。
  3. 在方法的最后,执行查询以获取相应的User实例。
  4. 将其他表单字段保存到该实例中。
  5. 修改URL conf,使其指向自定义表单和自定义后端

因此,URL conf为:

url(r'^accounts/register/$',
    register,
    {'backend': 'accounts.regbackend.RegBackend','form_class':MM_RegistrationForm},        
    name='registration_register'
    ),

regbackend.py具有必需的导入,并且基本上是DefaultBackend的副本,仅带有register()方法,并添加了:

    u = User.objects.get(username=new_user.username)
    u.first_name = kwargs['first_name']
    u.last_name = kwargs['last_name']
    u.save() 
2020-03-26