【问题标题】:Automatically create username in User model in Django based on other fields根据其他字段在Django的用户模型中自动创建用户名
【发布时间】:2012-07-23 20:01:51
【问题描述】:

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

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

我非常喜欢在模型中这样做。有没有一些标准的方法来做到这一点?还是只适合形式?我一直在研究各种User模型方法以及信号的重载,没有找到合适的地方可以添加。

【问题讨论】:

    标签: django django-models django-authentication django-users


    【解决方案1】:

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

    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)
    

    【讨论】:

    • 我在考虑使用它,但我担心表单实际上会用它做什么。表单在调用save() 之前验证输入,因此该字段将被视为无效。顺便提一句。 obj.save() 也会调用 pre_save 信号,所以我应该删除它(或者用你想到的其他东西替换)。
    • 您的解决方案有效,但并非总是有效(如果在保存之前处理了验证,我们就不走运了)并且需要调整(如果我们正在更新,删除 obj.save()get_unique_username 也应该有效现有模型)。一般来说,我认为没有更好的方法可以做到这一点,所以你的回答是可以接受的。谢谢。
    • 是的,现在更好了(我使用 obj.pk 而不是 obj.id 只是为了与不同的模型保持一致,我的主键不同于 id;我还检查是否定义了用户名并且不为空)。我已经接受了你的回答,现在我也可以投票了:) +1
    猜你喜欢
    • 1970-01-01
    • 2021-11-14
    • 2020-01-10
    • 2021-04-06
    • 2020-06-06
    • 1970-01-01
    • 2019-04-15
    • 2019-10-17
    • 1970-01-01
    相关资源
    最近更新 更多