【问题标题】:How do I get a default value to display in the template with django?如何使用 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}}

【问题讨论】:

    标签: django templates view model


    【解决方案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 }} 
        

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

        【讨论】:

          猜你喜欢
          • 2013-06-11
          • 1970-01-01
          • 1970-01-01
          • 2019-04-18
          • 1970-01-01
          • 2021-10-03
          • 2017-11-13
          • 2020-09-14
          • 2016-12-24
          相关资源
          最近更新 更多