5

組み込みの django ユーザーを拡張するときに user.get_profile を使用することを推奨する別の回答がここにあり、Web 上の他の場所を見ました。以下の例ではそれをしませんでした。機能は正常に動作しているようですが、user.get_profile() を使用しないことの欠点はありますか?

モデル

class UserProfile(models.Model):
    user = models.ForeignKey(User, primary_key=True)
    quote = models.CharField('Favorite quote', max_length =  200, null=True, blank=True)
    website = models.URLField('Personal website/blog', null=True, blank=True)

class UserProfileForm(ModelForm):
    class Meta:
        model = UserProfile
        fields = ('quote', 'website')

見る

@login_required 
def user_profile(request):
    user = User.objects.get(pk=request.user.id)
    if request.method == 'POST':
        upform = UserProfileForm(request.POST)
        if upform.is_valid():
            up = upform.save(commit=False)
            up.user = request.user
            up.save()
            return HttpResponseRedirect('/accounts/profile')
    else:
        upform = UserProfileForm()
    return render_to_response('reserve/templates/edit_profile.html', locals(), context_instance=RequestContext(request))
4

1 に答える 1

3

コードはあなたが書いたとおりに機能しますが、モデルにインスタンスを渡さないため、少し変わっているため、別の Django 開発者が何が起こっているのかを理解するにはもう少し時間がかかるかもしれません。

リンク先のビューは、モデル フォームをインスタンスでインスタンス化し、既存のプロファイル値がフォームに表示されるようにします。あなたの場合、空のフィールドが得られます。

upform = UserProfileForm(instance=user.get_profile())

インスタンスを提供しないため、保存すると新しい が作成されますがuser_profile、これは望ましくありません。主キーを作成したので、あなたの場合は起こりませんが、userそれも少し珍しいです。

書き込みの主な利点はuser.get_profile()、ユーザー プロファイルにどのモデルが使用されているかを知る必要がないことです。コードにモデルをハードコーディングしても構わない場合は、代わりにUserProfile置くことができます。instance=UserProfile.objects.get(user=user)

于 2012-07-26T14:28:23.577 に答える