如何使用 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 在模板中显示默认值?的主要内容,如果未能解决你的问题,请参考以下文章