1

モデルフォームを使用してユーザーのプロファイルを拡張しています。以前に保存したデータを、ユーザーが上書きする前にフォームに表示したいと思います。djangoを使用してテンプレートでこれを行うにはどうすればよいですか?

モデル

class UserProfile(models.Model):
    user = models.ForeignKey(User, primary_key=True)
    quote = models.CharField('About', 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')
        widgets = {
            'quote': Textarea(attrs={'cols': 18, 'rows': 7, 'style': "width: 300px;"}),
        }

見る

@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))

レンプレート

{{ upform.as_p}}
4

4 に答える 4

6

instance=user.get_profile()インスタンス化するUserProfileFormときにに渡します。

于 2012-07-27T14:26:31.150 に答える
0

instance=profileフォームをインスタンス化する両方の場所を渡します。これを少し簡単にするために、dictを作成し、**キーワード展開演算子を使用できます。

@login_required 
def user_profile(request):
    user = User.objects.get(pk=request.user.id)
    form_kwargs = {}
    try:
        form_kwargs['instance'] = user.get_profile()
    except Profile.DoesNotExist(): # change Profile to whatever your profile model is named
        pass

    if request.method == 'POST':
        upform = UserProfileForm(request.POST, **form_kwargs)
        if upform.is_valid():
            up = upform.save(commit=False)
            up.user = request.user
            up.save()
            return HttpResponseRedirect('/accounts/profile')
    else:
        upform = UserProfileForm(**form_kwargs)
    return render_to_response('reserve/templates/edit_profile.html', locals(), context_instance=RequestContext(request))
于 2012-07-30T22:36:36.737 に答える
0

ユーザーインスタンスではなく、UserProfileインスタンスを渡すと、フォームはUserProfileインスタンスを想定します。

UserProfileインスタンスをフォームに渡すための2つ(またはそれ以上)のオプションがあります。

オプション1get_or_create

get_or_createを使用できます。プロファイルを取得します。存在しない場合は、プロファイルを作成して保存します。 https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.get_or_create

userprofile=UserProfile.objects.get_or_create(user=request.user)

次に、UserProfileFormの両方の呼び出しにuserprofileを渡します

upform = UserProfileForm(request.POST, instance=userprofile)
upform = UserProfileForm(instance=userprofile)

オプション2get_profile()

user.get_profile()を使用する場合は、次のようにユーザープロファイルが正しく設定されていることを確認する必要があります: https ://docs.djangoproject.com/en/dev/topics/auth/ #storing-additional-information-about-users

主に、設定したsettings.pyで:

AUTH_PROFILE_MODULE = "account.UserProfile"

これは、代わりにMyAppにある場合、UserProfileが「アカウント」と呼ばれるアプリで定義されていることを前提としています。

AUTH_PROFILE_MODULE = "MyApp.UserProfile"

次に、(前述のように)次を使用できます。

upform = UserProfileForm(request.POST, instance=request.user.get_profile())
upform = UserProfileForm(instance= instance=request.user.get_profile())

ユーザーがまだプロファイルを作成していないインスタンスを処理する必要がありますが、ここでは、UserProfile.objects.getと同様に、get_profile()が失敗します。

于 2012-08-02T20:57:46.253 に答える
-1

次の形式でユーザーをインスタンスとして渡すだけだと思います。

@login_required 
...
    else:
        upform = UserProfileForm(instance=user)
...

次に、テンプレートを手動で作成する必要がある場合があります。

それで

Quote: {{ upform.quote }} 

すでに「保存された」見積もりを出力する必要があります。

于 2012-07-30T17:58:59.543 に答える