Python/Django django-registration添加额外字段

6
我已经阅读了很多关于在使用Django注册时添加额外字段的资料,例如这里这里这里。代码片段如下: forms.py (来自注册应用程序)
class RegistrationForm(forms.Form):
    username = forms.RegexField(regex=r'^\w+$', max_length=30, widget=forms.TextInput(attrs=attrs_dict), label=_("Username"), error_messages={ 'invalid': _("This value must contain only letters, numbers and underscores.") })
    email = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict, maxlength=75)), label=_("Email"))
    password1=forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False), label=_("Password"))
    institute=forms.CharField(max_length=50) #This is the new!
    password2 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False), label=_("Password (again)"))
    captcha = CaptchaField()

我使用django的注册保存方法,该方法在默认后端中:

def register(self, request, **kwargs):
    username, email, password = kwargs['username'], kwargs['email'], kwargs['password1']
    if Site._meta.installed:
        site = Site.objects.get_current()
    else:
        site = RequestSite(request)
    new_user = RegistrationProfile.objects.create_inactive_user(username, email,
                                                                password, site)

    signals.user_registered.send(sender=self.__class__,
                                 user=new_user,
                                 request=request)
    return new_user

在models.py中,我创建了一个新的类:
class UserProfile(models.Model):  
    user = models.OneToOneField(User)
    institute=models.CharField(max_length=50)
def create_user_profile(sender, instance, created, **kwargs):  
    if created:  
        profile, created = UserProfile.objects.get_or_create(user=instance)
post_save.connect(create_user_profile, sender=User)

在 admin.py 文件中:
admin.site.unregister(User)
class UserProfileInline(admin.StackedInline):
    model = UserProfile
class UserProfileAdmin(UserAdmin):
    inlines = [ UserProfileInline, ]
admin.site.register(User, UserProfileAdmin)

除此之外,我没有做任何修改。当我渲染表单时,我可以看到我添加的学院字段。当我在管理站点中时,我可以看到每个用户的用户配置文件。然而,在创建新用户时,除用户的其他详细信息正常保存外,没有保存任何内容。我认为我需要某种配置,但是在哪里?也许在Django-registration应用程序的文件中?


你发布的 RegistrationForm 是不完整的,保存方法在哪里? - Aamir Rind
我使用Django管理后台方法,并将其包含在原始帖子中。可能问题就出在这里。 - geompalik
2个回答

15

我已经找到了这个问题的解决方案,如果有人需要可以在这里发布。 我想这很简单。

步骤1:在models.py中添加一个新模型,它将是一个配置文件:

#models.py
class user_profile(models.Model):
     user=models.ForeignKey(User, unique=True)
     institution=models.CharField(max_length=200)

     def __unicode__(self):
         return u'%s %s' % (self.user, self.institution)

第二步:创建使用此模型的表单:

#forms.py
from registration.forms import RegistrationForm
from django.forms import ModelForm
from Test.models import user_profile

class UserRegForm(RegistrationForm):
    institution=forms.CharField(max_length=200)

步骤 3 创建ragbackend.py并定义数据的保存方式:

from Test.models import user_profile
from forms import *

def user_created(sender, user, request, **kwargs):
    form = UserRegForm(request.POST)
    data = user_profile(user=user)
    data.institution = form.data["institution"]
    data.save()

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

第四步 前往urls.py文件并进行以下更改:

import regbackend 
from registration.views import register

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

请注意,您必须按照该顺序放置URL。很容易理解为什么。

第5步 现在一切正常,但是您无法在管理网站中看到信息。因此,您需要转到admin.py并添加:

#admin.py
from django.contrib.auth.models import User
from Test.models import user_profile
admin.site.unregister(User)
class UserProfileInline(admin.StackedInline):
    model = user_profile

class UserProfileAdmin(UserAdmin):
    inlines = [ UserProfileInline, ]
admin.site.register(User, UserProfileAdmin)

就是这样。在运行服务器之前,不要忘记 syncdb。希望这能帮到大家。


真的很苦恼这个问题(我已经尝试了其他方法,所以变得绝望了!)。你的解决方案给了我一个数据库事务错误,如下面的问题所述。你能帮忙吗? https://dev59.com/JX_aa4cB1Zd3GeqP7cAW - KindOfGuy

5
除了Garrett的答案之外,我在使用django-registration 0.8版本时遇到了“无法导入名称register”的错误。我认为这是由于基于类的视图引起的,因此需要相应地更新urls.py
from django.conf.urls import patterns, include, url
from registration.backends.default.views import RegistrationView
from abby.apps.accounts.forms import UserRegForm

urlpatterns = patterns('',
    url(r'^register/$', RegistrationView.as_view(form_class=UserRegForm)),
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接