gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:26:14 34 4
gpt4 key购买 nike

我已经阅读了很多关于如何在使用 Django 注册时添加额外字段的信息,例如 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 注册应用程序的文件中?

最佳答案

我已经找到了解决这个问题的方法,我会在这里发布,以防有​​人可以使用它。这很简单,我想。

步骤 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)

步骤 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)

步骤 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)

第 4 步 转到 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之前 runserver .我希望这会帮助某人。

关于django - Python/Django django-registration 添加一个额外的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14726725/

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