如何在单个请求中使用 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 信号将数据保存在(用户和配置文件)表中?的主要内容,如果未能解决你的问题,请参考以下文章