【问题标题】:DetailView template not displaying model dataDetailView 模板不显示模型数据
【发布时间】:2013-08-22 03:33:55
【问题描述】:

我有一个想要显示为详细视图的模型,我创建了一个列表视图,其中包含一个指向其详细视图的链接。我没有收到任何错误,但模板没有呈现任何模型细节 链接到详细视图

<a href="../ancillaries/{{ Ancillary.id }}" > Product </a>

型号

from django.db import models
from django.core.urlresolvers import reverse

class Ancillary(models.Model):
     product_code = models.CharField(max_length=60, null=True)
     type = models.CharField(max_length=120, null=True)
     product = models.CharField(max_length=120, null=True)
     standard = models.CharField(max_length=120,   null=True)
     measurement = models.CharField(max_length=120,  null=True)
     brand = models.CharField(max_length=120,   null=True)

     class Meta:
          verbose_name_plural = "Ancillaries"
     def get_absolute_url(self):
          return reverse('ancillaries')
     def __unicode__(self):
          return u'%s %s %s %s %s %s  %s' % (self.id, self.product_code, self.type, 
                                self.product, self.standard, 
                                self.measurement, self.brand)

查看

class AncillaryDetail(DetailView):
    model = Ancillary
    def get_context_data(self, **kwargs):

        context = super(AncillaryDetail, self).get_context_data(**kwargs)

       context['ancillary_list'] = Ancillary.objects.all()
       return context

网址

url(r'^ancillaries/(?P<pk>\d+)/', AncillaryDetail.as_view(template_name='ancillary-detail.html')),

模板

{% for ancillary_list in object_list %}
{{ Ancillary.product}}
{{ Ancillary.type }}
{{ Ancillary.brand }}
{{ Ancillary.measurement }}
{% endfor %}

【问题讨论】:

  • 上面的模板看起来像一个列表视图。您为详细视图使用什么模板?为什么要将所有对象添加回详细上下文?
  • 哦不,上面的模板是我用于详细视图的模板。我不知道使用什么模板来显示详细视图数据。

标签: django django-templates django-views django-class-based-views


【解决方案1】:

试试:

{% for ancillary in ancillary_list %}
    {{ ancillary.product}}
    {{ ancillary.type }}
    {{ ancillary.brand }}
    {{ ancillary.measurement }}
{% endfor %}

我建议为 url 使用名称:

url(r'^ancillaries/(?P<pk>\d+)/', AncillaryDetail.as_view(), name="ancillary_details")

<a href="{% url 'ancillary_details' pk=ancillary.pk %}">

把它放在你的 DetailView 之后

template_name='ancillary-detail.html'

【讨论】:

  • 我只想补充一点,您应该避免将 template_name 放在 URLconf 中——而是将它放在 AncillaryDetail 的定义中,就在 model 属性下。
  • 我同意,我也是这样做的。编辑答案。
  • @BerislavLopac - 这是否不允许以类似于 Flask 的方式对 url/模板进行更多控制?换句话说,允许一对一映射?
  • 不确定你的意思,但 Django 处理 URL 的方式是它们在 patterns 中注册;您的 URL 仍然需要以某种方式注册。如果您有一个 CBV 属性,例如 view_url,则该类仍需要调用方法来注册它。
  • Flask 使用装饰器来做到这一点,在答案stackoverflow.com/a/13638521/122033 中描述了 Django 的一个这样的选项,我在野外看到过其他选项。但请注意,正如链接的答案所述,这是非常不合理的,并且它失去了我们现在拥有的导入包 URL 的选项。
【解决方案2】:

您似乎使用了documentation,但错误地修改了ListView 示例。如果您想显示单个模型实例,那么DetailView 是正确的视图。

正如@mrkre 建议的那样,您应该为您的 URL 模式命名(尽管我会使用单数形式的名称)。

url(r'^ancillaries/(?P<pk>\d+)/', AncillaryDetail.as_view(
                template_name='ancillary-detail.html'), name="ancillary_detail")

那么视图就很简单了

class AncillaryDetail(DetailView):
    model = Ancillary

在模板ancillary-detail.html 中,您使用默认名称object 访问模型实例。

{{ object.product}}
{{ object.type }}
{{ object.brand }}
{{ object.measurement }}

【讨论】:

  • 在下面的答案中查看 Berislav Lopac 的评论,我相信它也适用于这个答案。 “我只想补充一点,您应该避免将 template_name 放在 URLconf 中——而是将其放在 AncillaryDetail 的定义中,就在模型属性下。”
猜你喜欢
  • 2018-10-21
  • 2013-02-17
  • 2011-09-17
  • 2016-10-15
  • 2016-03-23
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多