【问题标题】:How to display Model data in a Django Template如何在 Django 模板中显示模型数据
【发布时间】:2016-05-06 09:43:39
【问题描述】:

我是 Django 新手。我正在尝试使用模板在我的索引视图中显示我的项目模型中的数据。我尽我所能来构建这个类似于投票应用程序的应用程序。我不确定我做错了什么。我正在使用 python 2.7 和 django 1.8.6

这是我的网址:

from django.conf.urls import url

from . import views

app_name = 'project'
urlpatterns = [
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
]

这是我的模型:

import datetime
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
from django.contrib.auth.models import User
from django.utils import timezone


@python_2_unicode_compatible  # only if you need to support Python 2
class Contractor(models.Model):
    #project
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=100, blank=True)
    phone = models.CharField(max_length=14, blank=True)
    city = models.CharField(max_length=60, blank=True)
    state = models.CharField(max_length=2, blank=True)
    created_by = models.ForeignKey(User, related_name='Contractor_created_by')
    created_date = models.DateTimeField()
    modified_by = models.ForeignKey(User, related_name='Contractor_modified_by')
    modified_date = models.DateTimeField()

    def __str__(self):
        return self.name

@python_2_unicode_compatible  # only if you need to support Python 2
class Project(models.Model):
    name = models.CharField(max_length=50)
    jobNumber = models.CharField(max_length=8)
    shopOut = models.DateTimeField(null=True)
    shopIn = models.DateTimeField(null=True)
    delivery = models.DateTimeField(null=True)
    job1 = models.CharField(max_length=50, null=True)
    job2 = models.CharField(max_length=50, null=True)
    job3 = models.CharField(max_length=50, null=True)
    contractor = models.ForeignKey(Contractor, on_delete=models.CASCADE, default=101)
    created_by = models.ForeignKey(User, related_name='Project_created_by')
    created_date = models.DateTimeField(auto_now_add=True)
    modified_by = models.ForeignKey(User, related_name='Project_modified_by')
    modified_date = models.DateTimeField(auto_now=True)
    def __str__(self):
        return self.name
    def save(self, *args, **kwargs):
        if not self.id:
            self.created_by = User.objects.get(id=1)
            self.modified_by = User.objects.get(id=1)
            super(Project, self).save(*args, **kwargs)
            year = datetime.datetime.now().year
            self.jobNumber = '{}{:04d}'.format(year, self.id)
        self.modified_by = User.objects.get(id=1)
        super(Project, self).save(*args, **kwargs)

这是我的观点:

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from django.views import generic
from django.utils import timezone

from .models import Project

# Create your views here.
class IndexView(generic.ListView):
    model = Project
    template_name = 'project/index.html'

    def get_queryset(self):
        return Project.objects

class DetailView(generic.DetailView):
    model = Project

这是我的模板:

{% load staticfiles %}
<h1>Projects</h1>
<ul>
{% for projects in project.get_queryset %}
    in for loop
    <!-- <li><a href="{% url 'projects:detail' projects.id %}">{{ projects.name }}</a></li> -->
    <li><a href="#">Test</a></li>
{% endfor %}

</ul>
end of list

当我转到该页面时,我得到一个 h1 项目、一个空 ul 和一行写着“列表结束”的行

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    在您的get_queryset 中,您应该返回Project.objects.all()

    在您的模板中,您不需要执行project.get_queryset,会为您调用get_queryset 方法,并将值作为object_list&lt;objectname&gt;_list 以及其他参数传递给模板。在您的情况下,对象是Project,因此应该有一个project_list 变量以及object_list

    你可以这样做:

    {% for project in project_list %}
        <li><a href="{% url 'projects:detail' project.id %}">{{ project.name }}</a></li>
    {% endfor %}
    

    或者:

    {% for project in object_list %}
        <li><a href="{% url 'projects:detail' project.id %}">{{ project.name }}</a></li>
    {% endfor %}
    

    您可以在这里阅读更多信息:https://docs.djangoproject.com/en/1.9/ref/class-based-views/generic-display/#listview

    【讨论】:

    • 您至少可以解释为什么操作应该返回该查询集,.. 我没有检查您从尚旺的答案中错过了什么
    • 除了尚旺的回答之外,我还解释了查询集是如何在 ListView 中处理的,以及遍历对象列表的两种可能方式。
    【解决方案2】:

    您的 get 查询集当前不返回查询集,目前它只是返回一个相关的经理。你应该让它返回一个查询集......

    def get_queryset(self):
        return Project.objects.all()  # added all
    

    【讨论】:

      【解决方案3】:

      你可能想试试:

      {% for project in object_list %}
          <li><a href="{% url 'projects:detail' project.id %}">{{ project.name }}</a></li>
      {% endfor %}
      

      object_list 是查询集的默认名称,如果您使用ListView,您可以通过在视图中定义context_object_name 来更改它。这里是django doc about that

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-13
        • 2013-02-17
        • 2019-09-03
        • 1970-01-01
        • 2021-10-01
        • 1970-01-01
        • 2019-10-09
        • 2016-10-15
        相关资源
        最近更新 更多