python - 当用户使用 django all-auth 注册时如何创建新的模型对象?

标签 python django django-models django-views django-allauth

当用户注册时,我想创建一个 profile 对象,如下所示:profile = Profile.objects.create(username=username,points=0,age=0). Django all-auth 的注册 View 如下所示:

class SignupView(RedirectAuthenticatedUserMixin, CloseableSignupMixin,
                 AjaxCapableProcessFormViewMixin, FormView):
    template_name = "account/signup." + app_settings.TEMPLATE_EXTENSION
    form_class = SignupForm
    redirect_field_name = "next"
    success_url = '/'

    @sensitive_post_parameters_m
    def dispatch(self, request, *args, **kwargs):
        return super(SignupView, self).dispatch(request, *args, **kwargs)

    def get_form_class(self):
        return get_form_class(app_settings.FORMS, 'signup', self.form_class)

    def get_success_url(self):
        # Explicitly passed ?next= URL takes precedence
        ret = (
            get_next_redirect_url(
                self.request,
                self.redirect_field_name) or self.success_url)
        return ret

    def form_valid(self, form):
        # By assigning the User to a property on the view, we allow subclasses
        # of SignupView to access the newly created User instance
        self.user = form.save(self.request)
        try:
            return complete_signup(
                self.request, self.user,
                app_settings.EMAIL_VERIFICATION,
                self.get_success_url())
        except ImmediateHttpResponse as e:
            return e.response

    def get_context_data(self, **kwargs):
        ret = super(SignupView, self).get_context_data(**kwargs)
        form = ret['form']
        email = self.request.session.get('account_verified_email')
        email_keys = ['email']
        if app_settings.SIGNUP_EMAIL_ENTER_TWICE:
            email_keys.append('email2')
        for email_key in email_keys:
            form.fields[email_key].initial = email
        login_url = passthrough_next_redirect_url(self.request,
                                                  reverse("account_login"),
                                                  self.redirect_field_name)
        redirect_field_name = self.redirect_field_name
        redirect_field_value = get_request_param(self.request,
                                                 redirect_field_name)
        ret.update({"login_url": login_url,
                    "redirect_field_name": redirect_field_name,
                    "redirect_field_value": redirect_field_value})
        return ret

在此 View 中的何处编写 object.create 代码?我发现很难理解 all-auth 的代码是如何工作的,这就是我为什么要问的原因。如果您想知道的话,这是我的模型:

class Profile(models.Model):
    username = models.CharField(max_length=32, default='AnonymousUser')
    age = models.IntegerField(default=0)
    points = models.IntegerField(default=0)

    def __str__(self):
        return self.username

最佳答案

您需要收听 user_signed_up信号

from allauth.account.signals import user_signed_up
from django.dispatch import receiver

@receiver(user_signed_up)
def after_user_signed_up(request, user):

    profile = Profile.objects.create(username=user.username, points=0, age=0)   

你的模型是错误的。您不应将用户名保存为个人资料中的字符字段

class Profile(models.Model):
    user = models.ForeignKey(User,null=True,blank=True)
    age = models.IntegerField(default=0)
    points = models.IntegerField(default=0)

关于python - 当用户使用 django all-auth 注册时如何创建新的模型对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41848519/

相关文章:

mysql - 将sql查询转换为django ORM函数调用

python - 从生成器函数中检索所有迭代器值

python - 如何显示另一个线程拥有的文件?

python - 如何动态打开json文件?

python - MinMax 缩放目标

python - 如何解决 Django 管理面板中非英语语言的大小写问题?

python - Django 在 for 循环中包含模板标签只捕获第一次迭代

python - django 中的 Model.id 和 Model.pk 有什么区别?

django - 尝试访问 ViewSet 创建定义中的 request.data 时出现 KeyError 'id'

python - 识别 django post_save 信号中更改的字段