【问题标题】:Cannot render views in template in Django无法在 Django 中的模板中呈现视图
【发布时间】:2021-02-14 14:17:21
【问题描述】:

我无法在模板中呈现我的视图。 我想我什么都试过了。 除了在模板上呈现数据外,一切正常。

我的模型.py:

from django.db import models
class Driver(models.Model):
    name = models.CharField(max_length=150)
    surname = models.CharField(max_length=150, default='')

    def __str__(self):
        return self.name

我的意见.py:

from django.shortcuts import render
from zoo.models import Driver


def MyView(request):
    drivers = Driver.objects.all()
    return render("zoo/base.html", {"drivers": drivers})

我的模板:

{% load staticfiles %}
{% load render_bundle from webpack_loader %}
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Example</title>
    {% render_bundle 'app' 'css' %}
  </head>
  <body>
     {{ drivers }}

     {{ drivers.name }}

     {% for driver in drivers %}
         {{driver.name}}

</body>
</html>

我的数据库有 315 个司机,包含司机的姓名和姓氏。

项目结构:

Project 
      app
         setting.py
         __init__.py
          ...
      zoo
         templates
              base.html
         __init__.py
         models.py
         views.py
          ...

【问题讨论】:

    标签: django templates django-templates


    【解决方案1】:

    views.py

    views.py更改:

    return render("zoo/base.html", {"drivers": drivers})
    

    到:

    return render(request, "zoo/base.html", {"drivers": drivers})
    

    模板

    您需要在模板中关闭 for 循环。在https://docs.djangoproject.com/en/3.1/ref/templates/builtins/ 有很好的信息值得一读。

    {% for driver in drivers %}
        {{ driver.name }}
    {% endfor %}
    

    此外,我从您提供的代码和您的解释中猜测{{ drivers.name }} 可能不会呈现。直到您遍历 drivers QuerySet 后,您才能访问各个 driver 字段(如 driver.name)。

    文件结构

    最好为模板和静态文件命名。 Django 的教程在https://docs.djangoproject.com/en/3.1/intro/tutorial03/ 讨论了这个问题。如果你这样做,你的目录结构将会改变(你目前拥有的):

    Project 
          app
             setting.py
             __init__.py
              ...
          zoo
             templates
                  base.html
             __init__.py
             models.py
             views.py
              ...
    

    到这里:

    Project 
          app
             setting.py
             __init__.py
              ...
          zoo
             templates
                zoo
                   base.html
             __init__.py
             models.py
             views.py
              ...
    

    最后,我强烈建议您将模板重命名为特定于该特定视图的名称。例如,如果这是您的索引视图,您可以将其命名为 index.html。或者zoo.html 与您的视图名称相对应。

    这不是必需的但是如果你想扩展一个base.html 文件,它会在你构建这个应用程序时很有用。这很方便,因为它允许您减少样板 html 并只关注每个模板/视图的核心功能。它还有一个优点是可以更轻松地在扩展同一个base.html 文件的不同页面之间提供一致的用户体验。

    如需了解更多信息,请查看https://docs.djangoproject.com/en/3.1/ref/templates/language/

    重要提示:如果您这样做,请不要忘记将您的呼叫更改为 views.py 中的 render 以适应您重命名的模板文件。 p>

    【讨论】:

      【解决方案2】:

      这个:

      return render("zoo/base.html", {"drivers": drivers})
      

      应该是这样的:

      return render(request, "zoo/base.html", {"drivers": drivers})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-26
        • 2019-04-06
        • 2019-03-10
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        • 2018-11-09
        • 2020-07-15
        相关资源
        最近更新 更多