【问题标题】:How to load an instance in Django ModelForms如何在 Django ModelForms 中加载实例
【发布时间】:2015-10-03 01:40:15
【问题描述】:

我正在使用 Django 的用户模型。

如何让 Django ModelForm 在模板中预填充值?我知道我必须使用该表单的实例,但我在下面哪里出错了:

models.py:

class Site(models.Model):
   user = models.ForeignKey(User, )
   site_name = models.CharField(max_length=128, blank=False, null=False)

forms.py:

class SiteForm(forms.ModelForm):
      class Meta:
            model = Site
            fields = '__all__'

views.py:

def settings(request):

    site_profile = Site.objects.get(user=request.user)

    if request.method == "POST":
        form = SiteForm( instance=site_profile )
            if form.is_valid():
                form.save()

                return redirect('dashboard_home')

        else:
            form = SiteForm()

        return render(request, "dashboard/settings.html", {'form': form })

此代码返回没有错误的页面,但不会使用数据库中的值预先填充表单字段。

我只能假设instance 没有正确加载?

【问题讨论】:

    标签: python django django-models django-forms django-views


    【解决方案1】:
    def settings(request):
        if request.method == "POST":
            form = SiteForm(request.POST, instance=request.user.site_profile)
            if form.is_valid():
                form.save()
                return redirect('dashboard_home')
        site_profile = Site.objects.get(user=request.user)
        form = SiteForm(instance=site_profile)
        return render(request, "dashboard/settings.html", {'form': form })
    

    您的缩进已关闭,并且您从未将 site_profile 传递给表单以填充它。如果出现POST 请求,您不想将旧版本的site_profile 传递给表单。我假设您想要用户在模板中填写的新值。

    【讨论】:

    • 您也必须在 POST 中传递实例。否则将创建一个新对象,而不是更新旧对象。
    • 我认为您需要将实例编辑为“request.user”。虽然答案很有用,但很难弄清楚。
    【解决方案2】:

    根据我的经验,在基于函数的视图中假设默认行为为GET 请求将避免一些错误,并且您将摆脱那些if-else 语句。如果您尝试编辑对象,您还需要在GET 请求期间填充表单:

    def settings(request):
        site_profile = Site.objects.get(user=request.user)
        form = SiteForm(instance=site_profile) # GET method
        if request.method == "POST":
            # Don't forget the request.POST !
            form = SiteForm(request.POST, instance=site_profile)
            if form.is_valid():
                form.save()
                return redirect('dashboard_home')
        return render(request, "dashboard/settings.html", {'form': form })
    

    【讨论】:

      【解决方案3】:
      def settings(request):
          site_profile = Site.objects.get(user=request.user)
      
          if request.method == "POST":
              form = SiteForm( instance=site_profile )
                  if form.is_valid():
                      form.save()
      
                      return redirect('dashboard_home')
      
          else:
              form = SiteForm(instance = site_profile)
      
              return render(request, "dashboard/settings.html", {'form': form })
      
      1. 第 12 行的 else 块有一个多缩进
      2. 您还必须在 else 块中设置实例参数

      【讨论】:

        猜你喜欢
        • 2011-04-21
        • 1970-01-01
        • 2017-02-28
        • 1970-01-01
        • 2020-08-29
        • 2021-08-01
        • 1970-01-01
        • 2021-02-11
        • 2011-11-12
        相关资源
        最近更新 更多