如何使用 django 在模板中显示默认值?

Posted

技术标签:

【中文标题】如何使用 django 在模板中显示默认值?【英文标题】:How do I get a default value to display in the template with django? 【发布时间】:2012-07-26 05:35:09 【问题描述】:

我正在使用模型表单来扩展用户的个人资料。我希望以前保存的数据在用户决定重写之前显示在表单中。如何使用 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

【问题讨论】:

【参考方案1】:

实例化时将instance=user.get_profile() 传递给UserProfileForm

【讨论】:

我将其更改为“upform = UserProfileForm(request.POST, instance=user.get_profile())”。我必须更改模板中的任何内容吗? 您应该向我们展示您的模板以了解是否需要更改 @armonge 我现在在模板中与表单相关的所有内容就是上面列出的内容。我不确定如何编辑它以包含默认数据(用户已输入的数据)。 我给你的代码用当前保存的数据作为字段的初始值来实例化表单。您所要做的就是将表单转储到模板中。您现在拥有的模板代码仅打印website 字段的input 元素,它不会输出整个表单。您可以简单地使用 form.as_p 之类的东西将整个内容拖放到页面上,或者使用 % for field in form % 单独呈现每个字段。 @ChrisPratt 我用简单的“ upform.as_p ”替换了当前模板中的内容,并且文本框/文本区域中的默认值文本仍未呈现。【参考方案2】:

在您实例化表单的两个地方传递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))

【讨论】:

【参考方案3】:

如果您传递一个,则表单需要一个 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 也会失败。

【讨论】:

【参考方案4】:

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

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

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

所以

Quote:  upform.quote  

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

【讨论】:

以上是关于如何使用 django 在模板中显示默认值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 模板中显示数组值?

如何在Django模板中显示数组值?

如何在 Django 模板中生成换行符

Django 如何使 ForeignKey 使用默认值?

如何使 ManyToMany 字段的值显示在 Django 通用 DeleteView 中

如何编辑 django-allauth 默认模板?