【问题标题】:Save user data in another table once a user is created in django admin在 django admin 中创建用户后,将用户数据保存在另一个表中
【发布时间】:2018-01-20 09:26:33
【问题描述】:

我是 django 的初学者。我正在使用 django 1.10 和 allauth 应用程序,它负责前端注册、发送用户确认电子邮件、验证、使用电子邮件登录等。

创建用户时,allauth 应用会在三个表中插入三行。

1. auth_user
2. account_emailaddress
3. account_emailconfirmation

从管理员添加用户时,它会在 auth_usergeneral_userprofile 表中创建一行。当管理员创建用户时,我想在account_emailaddress 表中插入一行。

account_emailaddress 中的字段是--

id
email
verified
primary
user_id

models.py 看起来像 --

class EmailAddress(models.Model):
    #user = models.ForeignKey(User)
    user = models.OneToOneField(User, unique=True, related_name ='address')
    email = models.EmailField()
    verified = models.BooleanField(verbose_name=_('verified'), default=True)
    primary = models.BooleanField(verbose_name=_('primary'), default=True)

    class Meta:
        db_table = 'account_emailaddress'


class UserProfile(models.Model, HashedPk):
    user = models.OneToOneField(User, unique=True, related_name ='profile')
    job_title = models.CharField(max_length=128, blank=True, null=False, default="")
    website = models.URLField(max_length=255, blank=True, null=True)
    organisation = models.CharField(max_length=50, blank=True, null=True, default="")
    phone_number = PhoneNumberField( blank=True, null=True)


@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)
        EmailAddress.objects.create(user=instance

)

Forms.py 看起来像这样

from django import forms
from django.contrib.auth.models import User
from django.utils.translation import ugettext as _
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Div, Field
from ajax_select.fields import AutoCompleteSelectField, AutoCompleteField
from phonenumber_field.formfields  import PhoneNumberField
from . import models
from captcha.fields import ReCaptchaField


class SignUpForm(forms.Form):
    first_name = forms.CharField(max_length=30)
    last_name = forms.CharField(max_length=30)
    phone_number = PhoneNumberField(label=_("Phone (Please state your country code eg. +44)"))
    organisation = forms.CharField(max_length=50)
    email = forms.EmailField()
    password1 = forms.CharField(max_length=20)
    password2 = forms.CharField(max_length=20)
    captcha = ReCaptchaField(attrs={'theme' : 'clean'})


    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        """
        profile, created = models.UserProfile.objects.get_or_create(user=user)
        profile.phone_number = self.cleaned_data['phone_number']
        profile.organisation = self.cleaned_data['organisation']
        profile.save()
        user.save()
        """
        up = user.profile
        up.phone_number = self.cleaned_data['phone_number']
        up.organisation = self.cleaned_data['organisation']
        user.save()
        up.save()

如何获取在EmailAddress 类下创建的用户 ID 和电子邮件并将其保存到表中。

【问题讨论】:

    标签: python django


    【解决方案1】:

    首先,如果您想在您的 EmailAdress 表中存储用户 ID 和电子邮件,您的模型中必须有这些字段。

    之后,当您的处理程序收到用户创建信号时,您可以在其中添加类似这样的内容。

    @receiver(post_save, sender=User)
    def create_profile(sender, instance, created, **kwargs):
        if created:
            UserProfile.objects.create(user=instance)
            EmailAdress.objects.create(user_id = instance.id, user_email=instance.email)
    

    【讨论】:

    • 非常感谢。首先,我需要获取模型中的电子邮件和用户字段。我会回来找你的。
    • 数据保存在表中,但由于某种原因,模型没有获得电子邮件价值。如何将电子邮件值传递给表。
    • 请发布您的用户和电子邮件地址模型。
    • 我已经用 models.py 和 forms.py 更新了帖子。在models.py中有userprofile模型,但没有用户模型。
    • 我已接受您的回答。这个问题的主要目的是解决。我将对如何在模型中获取电子邮件数据进行一些研究。
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多