1

だから私はdjangoで一般的な「アカウント」ページを作成しています。私はdjango-registrationプラグインを使用しましたが、現在(djang-standard)Userオブジェクトと、UserProfileおよびUserProfileFormオブジェクトがあります。

これはスタイル、またはベストプラクティスの問題だと思います。私が計画していることは「正しい」ですか、それともこれを行うための「より良い/推奨される/標準的な方法」がありますか?

私が計画しているのは、request.userからUserProfileを作成することです。

form = UserProfileForm(instance=User)

(そしてそのフォームをビューに送信します)、そしてUserProfileFormで:

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile

    def __init__(self,*args,**kwargs):
        super(UserProfileForm, self).__init__(*args, **kwargs)
        if kwargs.has_key('instance'):
            self.user = kwargs['instance']

私のUserProfileは次のようになっています。

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    points = models.IntegerField(default=0) #how is the user going with scores?

そして、ユーザーがdjango.contrib.auth.modelsさまざまな場所にいます。

Ok!編集と保存の処理は、mixindjangoのものを介して行われるか、おそらく、投稿と取得を処理する独自のユーザー定義ビューをミックスインで読んでいないためです。しかし、それを無視すると(ミックスインを使用する必要があると確信しているため)、上記は「正しいですか?」または提案はありますか?

乾杯!

4

1 に答える 1

1

django docs のユーザープロファイルを見てください。基本はそこにリストされています。ビューでフォームを使用することも検討する必要があります。

具体的なフィードバック:

  • UserProfile モデルは正しく作成されましたが、新しいユーザーが追加されるたびに (管理インターフェイスを介して、またはいずれかのビューでプログラムによって) 1 つのインスタンスを作成する必要があります。これを行うには、Userpost_saveシグナルに登録します。

    def create_user_profile(sender, instance, created, **kwargs):
        if created:
            UserProfile.objects.create(user=instance)
    post_save.connect(create_user_profile, sender=User)
    
  • UserProfileではなく、のインスタンスで ModelForm を初期化する必要がありますUser。現在のユーザー プロファイルは、( settings.py でrequest.user.get_profile()定義 した場合) でいつでも取得できます。AUTH_PROFILE_MODULEビューは次のようになります。

    def editprofile(request):
        user_profile = request.user.get_profile()
        if request.method == 'POST':
            form = UserProfileForm(request.POST, instance=user_profile)
            if form.is_valid():
                form.save()
                return HttpResponseRedirect('/accounts/profile')
        else:
            form = UserProfileForm(instance=user_profile)
        # ...
    
  • ModelForm でのinitオーバーライドは必要ありません。とにかく、 UserProfile インスタンスでそれを呼び出します。新しいユーザーを作成する場合は、 User コンストラクターを呼び出します。

    user = User()
    user.save()
    form = UserProfileForm(instance = user.get_profile())
    # ...
    
于 2012-07-06T10:32:14.653 に答える