如何在单个请求中使用 django 信号将数据保存在(用户和配置文件)表中?

Posted

技术标签:

【中文标题】如何在单个请求中使用 django 信号将数据保存在(用户和配置文件)表中?【英文标题】:How to save data in both (user and profile) tables using django signals in a single request? 【发布时间】:2021-09-25 06:15:12 【问题描述】:

我有一个包含字段(名字、姓氏、用户名、电子邮件、出生日期、电话号码)的注册表单。

我已使用信号在用户配置文件中创建记录。每当将新的用户数据添加到用户表时

我想要的是每当用户发布请求时。数据应该保存在用户表中,然后信号在配置文件表中创建一条记录,然后剩余的数据也应该填充在那里受尊重的字段中。因为我在注册时收到了用户的所有数据。

views.py

def register(request):

    if request.method == "POST":

        print(request.POST)


        first_name = request.POST.get('first-name')            <-----user table
        last_name = request.POST.get('last-name')            <-----user table
        username = request.POST.get('username')            <-----user table
        email = request.POST.get('email')            <-----user table
        gender = request.POST.get('gender')            <-----profile table
        date_of_birth = request.POST.get('date-of-birth')            <-----profile table
        address = request.POST.get('address')            <-----profile table
        phone_number = request.POST.get('mob-number')            <-----profile table

        ans_1 = request.POST.get('ans-1')            <-----profile table
        ans_2 = request.POST.get('ans-2')            <-----profile table

        User.objects.create_user(first_name=first_name, last_name=last_name, email=email, username=username, last_login=timezone.now())


    return render(request, 'authentication/register.html')

signals.py


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

@receiver(post_save, sender=User)
def save_user_info(sender, instance, **kwargs):
    instance.userinfo.save()

apps.py

class YourappConfig(AppConfig):
    ...
    def ready(self):
        import yourapp.signals

【问题讨论】:

【参考方案1】:

我不知道这是否是一个好的解决方案。但这对我有用。

views.py

def register_user(request):

    if request.method == "POST":

        new_user  =  User(first_name = request.POST.get('first-name'),
        last_name = request.POST.get('last-name'),
        username = request.POST.get('email-mobile'),
        last_login=timezone.now()
        # password = request.POST.get('password')
        )
        new_user.set_password(request.POST.get('password'))

        new_user.gender = request.POST.get('gender')
        new_user.date_of_birth = request.POST.get('dob')
        new_user.address = request.POST.get('address')

        new_user.ans_1 = request.POST.get('ans-1')
        new_user.ans_2 = request.POST.get('ans-2')
        new_user.save()
        return redirect('auth-login')

    return render(request, 'authentication/register.html')

signals.py

@receiver(post_save, sender=User)
def create_user_info(sender, instance, created, **kwargs):
    if created:
        attrs_needed= ['gender', 'date_of_birth', 'address', 'ans_1', 'ans_2']
        UserInformation.objects.create(user=instance, gender=instance.gender, date_of_birth = instance.date_of_birth, address=instance.address, ans_1=instance.ans_1, ans_2=instance.ans_2)


post_save.connect(create_user_info, sender=User, weak=False)

apps.py

class YourappConfig(AppConfig):
    ...
    def ready(self):
        import yourapp.signals

所以,我在这里所做的是我首先将所有请求数据绑定到User 对象。然后在signals.py 中获取实例(通过 post_save 信号传递),然后在创建 Userinfo 新对象时,我还将字段数据传递给它。

【讨论】:

【参考方案2】:

我本可以发表评论,但无法对您的问题添加评论。 我重现了您的错误,但我通过添加 ready() 函数并在 AppConfig(AppConfig) 类中添加 import yourapp.signals 更新了 app.py 我能够更新 Profile 模型

class YourappConfig(AppConfig):
    ...
    def ready(self):
        import yourapp.signals

【讨论】:

实际上我已经在我的代码中做到了。但我忘了在我的问题中提及它。那不是问题。无论如何thanx寻找它。我也发布了我的ans并发布了下来。

以上是关于如何在单个请求中使用 django 信号将数据保存在(用户和配置文件)表中?的主要内容,如果未能解决你的问题,请参考以下文章

Django-缓存信号

Django的缓存机制和信号

Django 缓存信号

django的缓存,信号,序列化

Django缓存和信号

8.Django缓存和信号