0

新しいユーザーがサインアップしたときに、各ユーザーに関する追加情報を自動的に保存するのに問題があります。ユーザーに関する追加データを保存するために、ユーザー モデル拡張のプロファイルを作成しました。ただし、シグナル ハンドラが post_save で呼び出されると、リクエストに格納されたデータは signal_handler に渡されません。

以下は私が作成したプロファイルです。

class StudentProfile(models.Model):

    user = models.ForeignKey(User, unique=True)

    # Other information about the Student
    city = models.CharField(max_length=25)
    country = models.CharField(max_length=25)
    student_age = models.IntegerField(max_length=3)

私のサインアップ ビューでは、ユーザー オブジェクトが作成され、新しい行がデータベースに追加される form.save() 関数を呼び出します。

def save(self, new_data):
    u = User.objects.create_user( new_data['username'],
                                new_data['email'],
                                new_data['password'])
    return u

その後、post_save シグナルが呼び出され、シグナル ハンドラーが新しいプロファイルの作成を試みます。

def create_student_profile(sender, instance, created, **kwargs):
    if created:
        StudentProfile.objects.create(user=instance)

post_save.connect(create_student_profile, sender=User)

この時点で、ブラウザに次のエラーが表示されます。

/signup/ での IntegrityError (1048、「列 'student_age' を null にすることはできません」)

コール スタックを調べたところ、実行されている SQL クエリの Student_age の値が None で、country と city の値が何もないことがわかりました。

sql u'INSERT INTO student_studentprofile( user_id, city, country, student_age) VALUES (17, , , なし)'

Student_age、country、city などのリクエスト パラメータをこのシグナル ハンドラに渡すにはどうすればよいですか? この情報を手動で保存する必要がありますか?

この質問の答えをstackOverflowとGoogleで徹底的に検索しましたが、手ぶらで来ました。

ご協力いただきありがとうございます。

4

2 に答える 2

0

requestpost_saveでアクセスできるとは思いません。シグナルは、モデルが作成されたことを他の人に通知するためのものです。彼らは、あなたがすでにモデルを作成し、そこに必要なデータを保存していることを前提としています。自分に合っている場合は、django-registrationを使用してください。django-registrationはシグナルを送信し、ユーザーが登録するたびにuser_registeredパスします。request

于 2012-06-21T22:22:38.457 に答える
0

はい、残念ながら、これらのフィールドをnull許容にする必要があります。次に、ユーザーが保存された後、それらをビューに設定します。

于 2012-06-21T22:31:28.770 に答える