6

Django-registration を使用するときに追加のフィールドを追加する方法については、 hereherehereなどをよく読みました。コード スニペットは次のとおりです: 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)

私は何も変更していません。フォームをレンダリングすると、追加した Institute フィールドが表示されます。管理サイトにいると、各ユーザーのユーザー プロファイルが表示されます。ただし、新しいユーザーを作成すると、ユーザーの他の詳細は通常保存されますが、そこには何も保存されません。なんらかの設定が必要だと思いますが、どこですか?たぶん、Django-registration アプリのファイルにあるでしょうか?

4

2 に答える 2

15

私はこの問題の解決策を見つけました。誰かがそれを使用できる場合に備えて、ここに投稿します。とても簡単だと思います。

ステップ1models.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)

ステップ2このモデルを使用するフォームを作成します。

#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)

ステップ3ragbackend.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)

ステップ4urls.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前を忘れないでくださいrunserver。これが誰かに役立つことを願っています。

于 2013-02-14T16:21:27.123 に答える