2012-07-25 10 views
5

ベストプラクティスを検索しましたが、見つかりませんでした。私は他の誰かが使う必要がある解決策を見つけることさえできませんでした。私はユニークなユーザー名を取得するまで、私はに必要他のフィールドに基づいてDjangoのユーザーモデルで自動的にユーザー名を作成します

は、必要に応じて末尾に整数を追加する、(最初&姓を名)彼の他のデータに基づいてユーザのユーザ名を生成します。

私はこれをモデルで行うことを強くお勧めします。それを行うためのいくつかの標準的な方法はありますか?それとも、フォームでのみ適切ですか?私は様々なUserモデルメソッドやシグナルのオーバーロードを研究していて、追加できる適切な場所が見つからなかった。

答えて

4

可能な解決策の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) 
+0

私はこれを使用することを考えていましたが、実際にどのような形でそれを行うのかと懸念しています。フォームは 'save()'を呼び出す前に入力を検証するので、フィールドは無効として扱われます。 Btw。 'obj.save()'も 'pre_save'シグナルを呼び出しますので、おそらくそれを削除するか、あるいはあなたが気づいた別のものに置き換えてください。 – Tadeck

+0

あなたのソリューションは動作しますが、必ずしもそうではありません(既存のモデルを更新している場合は、保存前に検証が処理されていて、運が悪いですし、調整が必要です( 'obj.save()'や 'get_unique_username') 。一般的に私はそれを行う良い方法はないと思うので、あなたの答えは受け入れられます。ありがとう。 – Tadeck

+0

@Tadeck答えを見て、今あなたの指摘している問題を処理します。 – Ahsan

関連する問題