2015-06-30 39 views
1

我有2個模型,我得到IndexView使用get_context_data方法正常工作。但是我的DetailView使用相同的技術是行不通的。我如何簡單地將2個模型放入DetailView多個模型通用DetailView到模板

views.py

from .models import CharacterSeries, CharacterUniverse 


class IndexView(generic.ListView): 
    template_name = 'character/index.html' 
    context_object_name = 'character_series_list' 

    def get_queryset(self): 
     return CharacterSeries.objects.order_by('name') 

    def get_context_data(self, **kwargs): 
     context = super(IndexView, self).get_context_data(**kwargs) 
     context['character_universe_list'] = CharacterUniverse.objects.order_by('name') 
     return context 


class DetailView(generic.DetailView): 
    model = CharacterSeries 
    template_name = 'character/detail.html' 

    def get_context_data(self, **kwargs): 
     context = super(DetailView, self).get_context_data(**kwargs) 
     context['character_universe_list'] = CharacterUniverse.objects.all() 
     return context 

我失去了一些東西;我需要將CharacterUniverse放入DetailView。我曾嘗試使用this page的信息無濟於事。

謝謝大家。

UPDATE:

detail.html

<ul> 
{% for series in characterseries.character_set.all %} 
    <li>{{ series.name }}</li> 
{% endfor %} 
</ul> 

<ul> 
{% for universe in characteruniverse.character_set.all %} 
    <li>{{ universe.name }}</li> 
{% endfor %} 
</ul> 

的index.html

{% load staticfiles %} 

<link rel ="stylesheet" type="text/css" href="{% static 'character/style.css' %}" /> 

<h1>Character Series</h1> 

<ul> 
    {% for character_series in character_series_list %} {# for MODEL in .. #} 
    <li><a href="{% url 'character:detail' character_series.pk %}">{{ character_series.name }}</a></li> 
    {% endfor %} 
</ul> 

<h1>Character Universe</h1> 

<ul> 
    {% for character_universe in character_universe_list %} {# for MODEL in .. #} 
    <li><a href="{% url 'character:detail' character_universe.pk %}">{{ character_universe.name }}</a></li> 
    {% endfor %} 
</ul> 

從官方文檔的一個例子:這是不可能在我的情況?

from django.views.generic import DetailView 
from books.models import Publisher, Book 

class PublisherDetail(DetailView): 

    model = Publisher 

    def get_context_data(self, **kwargs): 
     # Call the base implementation first to get a context 
     context = super(PublisherDetail, self).get_context_data(**kwargs) 
     # Add in a QuerySet of all the books 
     context['book_list'] = Book.objects.all() 
     return context 

也許這是最終的解決方案?這雖然不起作用..命名錯誤?


所有更新

views.py

from django.shortcuts import get_object_or_404, render 
from django.views import generic 
from django.views.generic import DetailView 
from .models import CharacterSeries, CharacterUniverse 


class IndexView(generic.ListView): 
    template_name = 'character/index.html' 
    context_object_name = 'character_series_list' 

    def get_queryset(self): 
     return CharacterSeries.objects.order_by('name') 

    def get_context_data(self, **kwargs): 
     context = super(IndexView, self).get_context_data(**kwargs) 
     context['character_universe_list'] = CharacterUniverse.objects.order_by('name') 
     return context 


class SeriesDetail(DetailView): 
    model = CharacterSeries 
    template_name = 'character/series_detail.html' 

class UniverseDetail(DetailView): 
    model = CharacterUniverse 
    template_name = 'character/universe_detail.html' 

urls.py

from django.conf.urls import url 

from . import views 

urlpatterns = [ 
    url(r'^$', views.IndexView.as_view(), name='index'), 
    url(r'^(?P<pk>[0-9]+)/$', views.SeriesDetail.as_view(), name='series_detail'), 
    url(r'^(?P<pk>[0-9]+)/$', views.UniverseDetail.as_view(), name='universe_detail'), 
] 

的index.html

{% load staticfiles %} 

<link rel ="stylesheet" type="text/css" href="{% static 'character/style.css' %}" /> 

<h1>Character Series</h1> 

<ul> 
    {% for character_series in character_series_list %} 
    <li><a href="{% url 'character:series_detail' character_series.pk %}">{{ character_series.name }}</a></li> 
    {% endfor %} 
</ul> 

<h1>Character Universe</h1> 

<ul> 
    {% for character_universe in character_universe_list %} 
    <li><a href="{% url 'character:universe_detail' character_universe.pk %}">{{ character_universe.name }}</a></li> 
    {% endfor %} 
</ul> 

series_detail.html

<ul> 
{% for series in characterseries.character_set.all %} 
    <li>{{ series.name }}</li> 
{% endfor %} 
</ul> 

universe_detail.html

<ul> 
{% for universe in characteruniverse.character_set.all %} 
    <li>{{ universe.name }}</li> 
{% endfor %} 
</ul> 
+0

@Alasdair我得到一個404(未找到)錯誤,當我點擊人物宇宙鏈接。字符系列鏈接工作正常,並去detail.html。 –

+0

@Alasdair請檢查我的更新。我把detail.html文件。 –

+1

這不是很清楚你想做什麼。我沒有看到任何鏈接在你的'get_context_data'中,你包含所有'CharacterUniverse'對象作爲'character_universe_list',但是在模板中你指的是'characteruniverse'。你不知道'characteruniverse'來自哪裏。 – Alasdair

回答

2

的,爲什麼你不能用一個視圖兩種解釋型號

A DetailView旨在顯示來自一個模型的對象的細節。包含額外的上下文很好,但該視圖並非設計用於處理兩種可能的模型。

來自文檔的示例顯示了一個發佈者的詳細信息,並同時顯示所有圖書。

Your DetailView可讓您顯示一個CharacterSeries的詳細信息,並同時顯示所有的CharacterUniverse。

但是,您不能使用同一個視圖來顯示一個CharacterUniverse的詳細信息。你需要一個不同的看法,爲一個CharacterUniverse

解決方案顯示詳細信息

因此,你需要兩個不同的詳細視圖,每一個模型。

您需要爲每個視圖指定一個獨特的URL。否則,該請求將總是匹配第一個正則表達式(在這種情況下series_detail。以下是可行的。

url(r'^series/(?P<pk>[0-9]+)/$', views.SeriesDetail.as_view(), name='series_detail'), 
url(r'^universe/(?P<pk>[0-9]+)/$', views.UniverseDetail.as_view(), name='universe_detail'), 
+0

我希望你去的地方,因爲你很棒。有用;忽略了這一點,現在它變得非常有意義。很贊。 –

+1

很高興我們到達那裏:) – Alasdair