如何在使用django-allauth时自定义用户配置文件

Shr*_*yas 98 django profile django-allauth

我有一个django-allauth app的django项目.我需要在注册时从用户那里收集其他数据.我在这里遇到了类似的问题, 但不幸的是,没有人回答了个人资料定制部分.

根据提供的文件django-allauth:

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)

就这样.

  • 这实际上取决于您要求的信息.无论如何,这都超出了allauth的范围.如果您在上面的示例中询问名/姓,那么您不需要额外的模型,并且可以将内容直接放入用户模型中.如果你要求用户的生日,他最喜欢的颜色或其他什么,那么你需要为此设置自己的个人资料模型.请看这里如何做到这一点:https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users (12认同)
  • 谢谢.听到原作者:)总是很好.我是否需要创建一个额外的类来存储此信息,或者allauth会自动处理该信息吗? (10认同)
  • 这正是我想要的 - 一个像喜欢的颜色的额外领域.如果我有兴趣说,最喜欢的颜色,我相信我应该创建一个新的UserProfile类,然后使用User作为一对一的字段和最喜欢的颜色作为附加字段.在这种情况下,我是否仍然可以使用上面已声明(具有喜欢的颜色)的SignUpForm类型并将ACCOUNT_SIGNUP_FORM_CLASS连接到它或者我是否需要创建表单并处理在我自己的代码中保存数据? (6认同)
  • @pennersr - 在收集并保存自定义用户模型字段的第一个社交登录后,我怎么能把这个`ACCOUNT_SIGNUP_FORM_CLASS`连接起来?"AUTH_USER_MODEL"的自定义用户模型的使用也改变自git:https://github.com/pennersr/django-allauth不会在pypi中上传. (5认同)
  • 当然,仍然可以使用ACCOUNT_SIGNUP_FORM_CLASS机制.您只需确保正确实现save()方法,以使喜欢的颜色存储在您想要的任何模型中. (4认同)
  • 现在它按预期工作,问题是由于`SOCIALACCOUNT_AUTO_SIGNUP`参数必须设置为'False`,以确保在第一次社交登录后正确调用自定义表单;) (3认同)

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)

  • @pennsesr 的答案现在已被编辑为使用 `signup` 而不是 `save`。 (2认同)

小智 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)


Ada*_*awy 5

在你的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 原则。