基于其他字段在Django的用户模型中自动创建用户名

基于其他字段在Django的用户模型中自动创建用户名,django,django-models,django-authentication,django-users,Django,Django Models,Django Authentication,Django Users,我一直在寻找最佳实践,但没有找到。我甚至找不到其他人需要的解决方案 我需要根据用户的其他数据生成用户的用户名(名字和姓氏),可以选择在末尾添加整数,直到得到唯一的用户名 我非常喜欢在模型中这样做。有什么标准的方法可以做到这一点吗?还是只在形式上合适?我一直在研究各种用户模型方法以及信号的过载,但没有找到任何合适的地方可以添加它。一种可能的解决方案是通过信号 我在考虑使用它,但我关心的是表单将如何处理它。表单在调用save()之前验证输入,因此该字段将被视为无效。顺便说一句,obj.save()也

我一直在寻找最佳实践,但没有找到。我甚至找不到其他人需要的解决方案

我需要根据用户的其他数据生成用户的用户名(名字和姓氏),可以选择在末尾添加整数,直到得到唯一的用户名


我非常喜欢在模型中这样做。有什么标准的方法可以做到这一点吗?还是只在形式上合适?我一直在研究各种
用户
模型方法以及信号的过载,但没有找到任何合适的地方可以添加它。

一种可能的解决方案是通过信号


我在考虑使用它,但我关心的是表单将如何处理它。表单在调用
save()
之前验证输入,因此该字段将被视为无效。顺便说一句,
obj.save()
也将调用
pre_save
信号,因此我建议您可能应该删除该信号(或替换为您想到的其他信号)。您的解决方案可以工作,但并不总是有效(如果在保存之前处理验证,我们就倒霉了),并且需要进行调整(删除
obj.save())
,和
获取唯一用户名(如果我们正在更新现有模型,也应该可以使用)。总的来说,我认为没有比这更好的方法了,所以你的答案是可以接受的。谢谢。是的,现在更好了(我使用
obj.pk
而不是
obj.id
只是为了与不同的型号保持一致,我的主键不同于
id
;我还检查用户名是否已定义且不为空)。我已经接受了你的回答,现在我也可以投票了:)+1
def my_callback(sender, **kwargs):
    obj = kwargs['instance'] 
    if not obj.id:
       username = get_unique_username(obj) # method that combines first name and last name then query on User model, if record found, will append integer 1 and then query again, until found unique username
       obj.username = username
pre_save.connect(my_callback, sender=User)