2012-07-27 44 views
1

我正在使用模型来扩展用户的配置文件。我希望以前保存的数据在用户决定写入之前显示在表单中。如何在django模板中执行此操作?如何获得默认值以显示在模板与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}} 

回答

6

通行证instance=user.get_profile()UserProfileForm当你实例化。

+0

我将它改为“upform = UserProfileForm(request.POST,instance = user.get_profile())”。我必须更改模板中的任何内容吗? – sharataka 2012-07-27 14:45:35

+0

您应该向我们展示您的模板,以了解它是否必须更改 – armonge 2012-07-27 20:55:17

+0

@armonge我现在在与表单相关的模板中有上面列出的内容。我不确定如何编辑它以包含默认数据(用户已输入的数据)。 – sharataka 2012-07-27 21:05:43

-1

我觉得你只是通过用户在形式的实例:

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

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

所以

Quote: {{ upform.quote }} 

应该输出已'保存'报价。

+0

为什么选择投票?这会工作。 – Lonoshea 2012-08-21 18:39:15

0

通过instance=profile在你实例化窗体的地方。为了使这更容易一点,你可以创建一个字典,并使用**关键字扩展操作:如果传递的,而不是用户实例

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

形式需要一个用户配置实例。

您有两个(或更多)选项可将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

主要在您的设置中。已设置潘岳:

AUTH_PROFILE_MODULE = "account.UserProfile" 

这是假定用户配置在所谓的“帐户”应用程序定义,如果在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.o bjects.get。