python - Django:如何创建用户并设置其相关字段
问题描述
我已经使用另一个模型(OneToOne 关系)扩展了用户数据,并且在创建用户时,也会创建其配置文件。我想在没有查询的情况下创建用户时更新字段邮件。
模型.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
mailing = models.BooleanField(default=False)
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
视图.py
def register(request):
...
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save(commit=False)
user.mailing = profile_form.cleaned_data['mailing']
user.save() #The user is created but mailing is not set
return redirect('login')
profile_backend.py
class ProfileBackend(ModelBackend):
def get_user(self, user_id):
UserModel = get_user_model()
try:
return UserModel._default_manager.select_related('profile').get(pk=user_id)
except UserModel.DoesNotExist:
return None
我可以设置以用户为对象的变量,但这意味着使用额外的函数。
解决方案
@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, **kwargs):
if created:
profile_id = uuid.uuid1().hex #for unique id if any
Profile.objects.create(user=instance,profile_id=profile_id)
instance.profile.save()
这是我的示例代码之一。这可能会帮助你。
推荐阅读
- abap - 750 补丁级别 8 - ABAP 编辑器在复制和粘贴后冻结
- node.js - 如何在 app.js 中使用 LUIS 来识别不同文件夹中的对话框
- phpunit - 我想为发送邮件创建单元测试(phpunit,嘲笑)
- c# - 相机跟随实例化光子多人游戏
- java - 压缩字符串方法不返回新字符串?
- python - TensorFlow Eager 模式支持文本摘要
- java - 如何将“null”值分配给 Java 中的 int[] 数组中的单个元素
- windows-services - Tomcat卸载使用控制面板-Tomcat服务未删除
- javascript - JS:使用键值对的构造函数的性能
- xcode - PDF Kit View 不在我的 Xcode 对象库中