22

Django アプリケーションにユーザー登録フォームがあり、ユーザーが住所、都市、国、電話番号などの登録を試みているときに追加データを収集します。

post_saveこのデータは、シグナルを介して Account モデル クラスに保存されます。ユーザー作成プロセスは次のようになります。

# Function to Create user Account/Profile
def create_user_account(sender, instance, created, **kwargs):
    if created:
      models.Account.objects.create(user=instance)

# Create User / User Registration
def UserRegistration(request):
    if request.method == 'POST':
        username = request.POST['fn'].capitalize() + ' ' + request.POST['ln'].capitalize()
        # CREATE USER
        newuser = User.objects.create_user(username=username, email=request.POST['email'], password=request.POST['pw'])
        newuser.first_name = request.POST['fn'].capitalize()
        newuser.last_name = request.POST['ln'].capitalize()
        newuser.save()
    return HttpResponse(username)

#Post Save handler to create user Account/Profile
post_save.connect(create_user_account, sender=User)

ここではUserRegistration、ユーザーがフォームを投稿すると関数が呼び出され、この関数の下で POST データを取得できます。そのデータをメソッドに渡して、モデルcreate_user_accountのフィールドに入力する必要があります。Account

現在、Accountデータベースに作成されたオブジェクトが表示されますが、ユーザー フィールド以外のすべてのフィールドが空です。明らかに、POST 変数がcreate_user_accountメソッドに渡されていないためです。

4

3 に答える 3

22

私がしていることは、いくつかの '_attrs' をインスタンスに設定し、それらをシグナル ハンドラーで使用することです。

あなたのケースは次のようになると思います:

# Function to Create user Account/Profile
def create_user_account(sender, instance, created, **kwargs):
    if created:
        attrs_needed = ['_language', '_field', '_otherfield']
        if all(hasattr(instance, attr) for attr in attr_needed):
            models.Account.objects.create(
                user=instance, 
                language=instance._language, 
                field=instance._field,
                otherfield=instance._otherfield)

# Create User / User Registration
def UserRegistration(request):
  if request.method == 'POST':
    username = request.POST['fn'].capitalize() + ' ' + request.POST['ln'].capitalize()
    # CREATE USER
    newuser = User.objects.create_user(
        username=username, email=request.POST['email'],
        password=request.POST['pw'])
    newuser.first_name = request.POST['fn'].capitalize()
    newuser.last_name = request.POST['ln'].capitalize()

    # Set some extra attrs to the instance to be used in the handler.
    newuser._language = request.POST['language']
    newuser._field = request.POST['field']
    newuser._otherfield = request.POST['otherfield']
    newuser.save()


  return HttpResponse(username)

#Post Save handler to create user Account/Profile
post_save.connect(create_user_account, sender=User)

私はこれを行うのが嫌いで、恐ろしい方法で壊れる可能性があり、デバッグが難しい場合があると思います。また、ハンドラーに必要なデータを強制する厳密な方法はありませんsignal_data(data, signal, instance)。特定のインスタンスのシグナル ハンドラー。

私が試したことのない良いオプションは、インスタンスのメソッドをシグナルのハンドラーとして使用することです。おそらく、より構造化された方法でデータを渡すことができます。

さよなら。

于 2012-07-09T01:23:17.147 に答える
0

andメソッドreceiver(post_save, sender=User)を使用するとすぐに呼び出されることがわかりました。そのため、最初にオブジェクトを初期化してから、追加のフィールドに入力する必要があります。create_usercreate

于 2022-01-15T07:42:04.453 に答える