2017-02-01 9 views
0

私はゆるやかにチュートリアルに従いましたが、一般的な詳細ビューが正しく動作するように縫い合わせることはできません。私はpkを呼び出していますが、ページは表示されますが、変数{{publisher.name}}は表示されません。私はいくつかのコードをビューとモデルから削除しましたが、私は周辺機器と見なしていますが、エラーが明らかでない場合は再投稿できます。変数(フィールド?)はDjangoの一般的な詳細ビューで表示されません

すべてのファイルはHTMLファイルを除くポーリングディレクトリ内にあるが、ポーリング/テンプレート/世論調査で

おかげ

URL.pyがView.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'), 
] 

です

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}) 

答えて

0

テンプレート内のオブジェクトがないPublisherpublisherと呼ばれています。

+1

まあ、通常は 'オブジェクト'です。 –

+0

いいえ、 'get_context_object_name()'は、モデルの小文字の名前を使用します。 –

+2

両方とも動作します:https://docs.djangoproject.com/en/1.11/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_context_data –

0

テンプレートのこのようなモデルのインスタンスにアクセスすることはできません。 PublisherはModelクラスの名前ですが、インスタンスではありません。一般的な詳細ビューでのオブジェクトのデフォルト名はobjectです。したがって、{{ object.name }}を使用する必要があります。または、小文字のモデル名もデフォルトとして使用できます。あなたの場合thats publisher

オブジェクトの変数名を変更する場合は、詳細ビューのメソッドget_context_object_name(obj)を実装する必要があります。 このメソッドは、詳細ビューテンプレートでオブジェクトの希望する変数名を含む文字列を返す必要があります。

0

テンプレート内のオブジェクトのデフォルト名はobjectで、小文字のモデル名はエイリアス(publisher)として機能します。 docsで説明するように、クラス属性context_object_name経由ビューでその名前を指定することができます。

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

その後

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

テンプレートで動作します。

+1

小文字のモデル名が 'object'へのデフォルトのエイリアスであるので、' publisher'のボックスの外で動作します。 [ここをクリック](https://docs.djangoproject.com/en/1.10/ref/class-based-views/mixins-single-object/#django.views.generic.detail.SingleObjectMixin.get_context_object_name)。 – trixn

+0

@trixnそれはもっと正確です。私の答えを指定... – schwobaseggl

+0

説明に感謝! –

関連する問題