变量(字段?)不会显示在 Django 通用详细信息视图中
Variables (fields?) Won't Display in Django Generic Detail View
我一直在松散地遵循教程,但无法通过接缝来获得通用的细节视图以正常工作。我用 pk 调用,页面显示,但变量 {{publisher.name}} 没有显示。我已经从视图和模型中删除了一些我认为是外围的代码,但如果错误不明显,我可以重新发布。
除了 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})
模板中的对象名为 publisher
,而不是 Publisher
。
您不能像这样在模板中访问模型实例。 Publisher
是模型的名称 class 但不是模型的实例。通用详细视图中对象的默认名称是 object
。所以你需要使用{{ object.name }}
。或者您也可以使用小写的模型名称作为默认名称。在你的情况下就是 publisher
.
如果你想改变你的对象的变量名,你必须实现你的细节视图的get_context_object_name(obj)
方法。
该方法必须 return 一个字符串,其中包含详细视图模板中对象的所需变量名称。
模板中对象的默认名称是object
,而小写模型名称作为别名(publisher
)。您可以通过 class 属性 context_object_name
在视图中指定该名称,如 docs:
中所述
class PublisherDetail(generic.DetailView):
# ...
context_object_name = 'foo'
然后
{{ foo.name }}
# {{ publisher.name }} should work out of the box
将在模板中工作。
我一直在松散地遵循教程,但无法通过接缝来获得通用的细节视图以正常工作。我用 pk 调用,页面显示,但变量 {{publisher.name}} 没有显示。我已经从视图和模型中删除了一些我认为是外围的代码,但如果错误不明显,我可以重新发布。
除了 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})
模板中的对象名为 publisher
,而不是 Publisher
。
您不能像这样在模板中访问模型实例。 Publisher
是模型的名称 class 但不是模型的实例。通用详细视图中对象的默认名称是 object
。所以你需要使用{{ object.name }}
。或者您也可以使用小写的模型名称作为默认名称。在你的情况下就是 publisher
.
如果你想改变你的对象的变量名,你必须实现你的细节视图的get_context_object_name(obj)
方法。
该方法必须 return 一个字符串,其中包含详细视图模板中对象的所需变量名称。
模板中对象的默认名称是object
,而小写模型名称作为别名(publisher
)。您可以通过 class 属性 context_object_name
在视图中指定该名称,如 docs:
class PublisherDetail(generic.DetailView):
# ...
context_object_name = 'foo'
然后
{{ foo.name }}
# {{ publisher.name }} should work out of the box
将在模板中工作。