Shr*_*yas 98 django profile django-allauth
我有一个django-allauth app的django项目.我需要在注册时从用户那里收集其他数据.我在这里遇到了类似的问题, 但不幸的是,没有人回答了个人资料定制部分.
ACCOUNT_SIGNUP_FORM_CLASS
(=None
)指向自定义表单类(例如
‘myapp.forms.SignupForm’
)的字符串,用于在注册期间向用户请求其他输入(例如,简报注册,出生日期).此类应实现一个‘save’
方法,接受新注册的用户作为其唯一参数.
我是django的新手,我正在努力解决这个问题.有人可以提供这种自定义表单类的示例吗?我是否需要添加一个模型类,以及一个链接到喜欢的用户对象这个 ?
pen*_*rsr 158
假设您想在注册期间询问用户他的姓/名.您需要将这些字段放在您自己的表单中,如下所示:
class SignupForm(forms.Form):
first_name = forms.CharField(max_length=30, label='Voornaam')
last_name = forms.CharField(max_length=30, label='Achternaam')
def signup(self, request, user):
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.save()
Run Code Online (Sandbox Code Playgroud)
然后,在您的设置中指向此表单:
ACCOUNT_SIGNUP_FORM_CLASS = 'yourproject.yourapp.forms.SignupForm'
Run Code Online (Sandbox Code Playgroud)
就这样.
fer*_*ngb 22
使用pennersr建议的解决方案,我得到了一个DeprecationWarning:
DeprecationWarning: The custom signup form must offer a def signup(self, request, user) method DeprecationWarning)
Run Code Online (Sandbox Code Playgroud)
这是因为从版本0.15开始,不推荐使用save方法,而采用def注册(请求,用户)方法.
所以要解决这个问题,示例的代码应该是这样的:
class SignupForm(forms.Form):
first_name = forms.CharField(max_length=30, label='Voornaam')
last_name = forms.CharField(max_length=30, label='Achternaam')
def signup(self, request, user):
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.save()
Run Code Online (Sandbox Code Playgroud)
小智 15
这里结合了一些其他答案(没有一个是100%完成和DRY)对我有用.
在yourapp/forms.py
:
from django.contrib.auth import get_user_model
from django import forms
class SignupForm(forms.ModelForm):
class Meta:
model = get_user_model()
fields = ['first_name', 'last_name']
def signup(self, request, user):
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.save()
Run Code Online (Sandbox Code Playgroud)
并在settings.py
:
ACCOUNT_SIGNUP_FORM_CLASS = 'yourapp.forms.SignupForm'
Run Code Online (Sandbox Code Playgroud)
这样它就可以使用模型表单,这样它就是DRY,并使用新的def signup
.我试过推,'myproject.myapp.forms.SignupForm'
但这导致了某种错误.
小智 6
@Shreyas:以下解决方案可能不是最干净的,但它确实有效.如果您有任何建议可以进一步清理,请告诉我.
要添加不属于默认用户配置文件的信息,请首先在yourapp/models.py中创建模型.阅读一般django文档以了解更多信息,但基本上:
from django.db import models
class UserProfile(models.Model):
user = models.OneToOneField(User, related_name='profile')
organisation = models.CharField(organisation, max_length=100, blank=True)
Run Code Online (Sandbox Code Playgroud)
然后在yourapp/forms.py中创建一个表单:
from django import forms
class SignupForm(forms.Form):
first_name = forms.CharField(max_length=30, label='Voornaam')
last_name = forms.CharField(max_length=30, label='Achternaam')
organisation = forms.CharField(max_length=20, label='organisation')
def signup(self, request, user):
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
# Replace 'profile' below with the related_name on the OneToOneField linking back to the User model
up = user.profile
up.organisation = self.cleaned_data['organisation']
user.save()
up.save()
Run Code Online (Sandbox Code Playgroud)
在你的users/forms.py
你放:
from django.contrib.auth import get_user_model
class SignupForm(forms.ModelForm):
class Meta:
model = get_user_model()
fields = ['first_name', 'last_name']
def save(self, user):
user.save()
Run Code Online (Sandbox Code Playgroud)
在 settings.py 中,您输入:
ACCOUNT_SIGNUP_FORM_CLASS = 'users.forms.SignupForm'
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您不会因多重用户模型字段定义而破坏 DRY 原则。
归档时间: |
|
查看次数: |
36240 次 |
最近记录: |