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

如果您传递一个,则表单需要一个 UserProfile 实例,而不是用户实例。

您有两个(或更多)选项可以将 UserProfile 实例传递给您的表单。

选项 1 get_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)

然后将 userprofile 传递给 UserProfileForm 的两个调用

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

选项 2 get_profile()

有几件事要检查,如果你想使用 user.get_profile() 你需要确保你的用户配置文件设置正确,如下所示: https ://docs.djangoproject.com/en/dev/topics/auth/ #storing-additional-information-about-users

主要是在您设置的 settings.py 中:

AUTH_PROFILE_MODULE = "account.UserProfile"

这假设 UserProfile 是在名为“ account ”的应用程序中定义的,如果它在 MyApp 中:

AUTH_PROFILE_MODULE = "MyApp.UserProfile"

那么你可以使用(如前所述):

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

尽管您需要处理用户尚未创建配置文件的实例,但这里的 get_profile() 会失败,UserProfile.objects.get 也会失败。

于 2012-08-02T20:57:46.253 回答
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 回答
-1

我认为您只是将用户作为实例传递给表单:

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

然后,您可能需要手动构建您的模板:

所以

Quote: {{ upform.quote }} 

应该输出已经“保存”的报价。

于 2012-07-30T17:58:59.543 回答