【问题标题】:Variables (fields?) Won't Display in Django Generic Detail View变量(字段?)不会显示在 Django 通用详细信息视图中
【发布时间】:2017-02-01 13:36:56
【问题描述】:

我一直在松散地按照教程进行操作,无法缝合以使通用详细视图正常工作。我用 pk 调用,页面显示,但变量 {{publisher.name}} 没有显示。我已经从视图和模型中删除了一些我认为是外围设备的代码,但如果错误不明显,我可以重新发布。

所有文件都在 poll 目录中,除了 HTML 文件在 poll/template/poll 中

谢谢

URL.py 是

from django.conf.urls import url
from poll.views import PublisherList
from . import views

app_name = "poll"

urlpatterns = [
    url(r'^publishers/$', PublisherList.as_view(), name = "publisherlist"),
    url(r'^start/', views.PublisherCreate.as_view(), name = 'make-publisher'),
    url(r'^(?P<pk>[0-9]+)/$', views.PublisherDetail.as_view(), name = 'detail-publisher'),
]

View.py

from django.shortcuts import render
from django.views.generic.edit import CreateView
from django.views import generic
from django.views.generic import ListView
from poll.models import Publisher

...

class PublisherDetail(generic.DetailView):
    model = Publisher
    template_name = 'Poll/publisher_details.html'

和 HTML 文件

{% extends "personal/header.html" %}

{% block content %}

<h1>{{ Publisher.name }}</h1>
<h1>Options</h1>
{%endblock%}

和models.py

from django.db import models
from django.core.urlresolvers import reverse
# Create your models here.


class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=50)
    city = models.CharField(max_length=60)
    state_province = models.CharField(max_length=30)
    country = models.CharField(max_length=50)
    website = models.URLField()

    class Meta:
        ordering = ["-name"]

    def __str__(self):              # __unicode__ on Python 2
        return self.name

    def get_absolute_url(self):
        return reverse('build:details', kwargs = {'pk':self.pk})

【问题讨论】:

    标签: python django detailsview


    【解决方案1】:

    模板中的对象称为publisher,而不是Publisher

    【讨论】:

    【解决方案2】:

    您不能在模板中像这样访问模型的实例。 Publisher 是 Model 类的名称,但不是它的实例。通用详细视图中对象的默认名称是object。所以你需要使用{{ object.name }}。或者您也可以使用小写的模型名称作为默认值。你的情况就是publisher

    如果您想更改对象的变量名,您必须实现详细视图的get_context_object_name(obj) 方法。 该方法必须返回一个字符串,其中包含详细视图模板中对象的所需变量名称。

    【讨论】:

      【解决方案3】:

      模板中对象的默认名称是object,而小写的模型名称用作别名(publisher)。您可以通过类属性context_object_name 在视图中指定该名称,如docs 中所述:

      class PublisherDetail(generic.DetailView):
          # ...
          context_object_name = 'foo' 
      

      然后

      {{ foo.name }}
      # {{ publisher.name }}  should work out of the box
      

      将在模板中工作。

      【讨论】:

      • 它可以与publisher 一起使用,因为小写的型号名称是object 的默认别名。 See here.
      猜你喜欢
      • 1970-01-01
      • 2014-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 2018-03-26
      相关资源
      最近更新 更多