2014-06-15 64 views
0

在我的應用程序中,我有一堆DetailViews和ListViews。我需要爲每個頁面添加一個包含「上次訪問的頁面」信息的面板。我知道我可以創建兩個自己的類,它們分別繼承自DetailView和ListView,並重寫get_context_data方法,但會公佈代碼。目前我解決了這個問題,只需在每個視圖中添加一行代碼如何使用Django mixin?

context['panel_info'] = get_panel_info() 

但我不喜歡這個解決方案。 我的想法是創建一個mixin定製get_context_data方法,但據我所知,如果我繼承了這樣的

class MyView(DetailView, MyMixin): 
    def get_context_data(self, **kwargs): 
     context = super(MyView, self).get_context_data(**kwargs) 
     return context 

密新的方法不會在所有調用。 那麼最明智的解決方案是什麼?

+3

聽起來像你需要[模板上下文處理器](https://docs.djangoproject.com/en/1.6/ref/templates/api/#writing-your-own-context-processors)。 –

回答

1

有不同的方法可以做到這一點,如果你需要對所有視圖可重用的東西,那麼上下文處理器可能是解決方案,但如果你只需要某些特定的視圖,那麼Mixin也可能做到這一點。 你怎麼做:

class MyMixin(object): 

    def get_context_data(self, **kwargs): 
     context = super(MyMixin, self).get_context_data(**kwargs) 
     context['panel_info'] = get_panel_info() 
     return context 


class MyView(MyMixin, DetailView): 
    ... 

你並不需要重寫get_context_data在MyView的了的Mixin工作。

+0

謝謝,那對我有效。我不明白,我第一次搞砸了同樣的事情。我會堅持這個設計,因爲它似乎更清楚我的情況。 – eyeinthebrick

+0

你搞砸了類的順序(Mixin先走了,然後是CBV):) – petkostas

+0

我試過兩種方法,也許它只是睡眠時間。儘管如此,它現在起作用。 – eyeinthebrick

1

BurhanKhalid提到,使用模板上下文處理器是一個聰明的解決方案。上下文處理器允許您指定一些自動在每個上下文中設置的變量。

唯一的問題是您需要使用RequestContext來代替Context。所以,

def my_view(request): 
    return render(request, 'template.html', {'whatever': 'whatever'}, 
        context_instance=RequestContext(request)) 

使上下文處理器。它基本上是一個採用HttpRequest並返回字典的方法。

def last_visited_pages_context_processor(request): 
    # Your custom code 
    return {'foo': 'bar'} 

現在,只需添加上下文處理器TEMPLATE_CONTEXT_PROCESSORSsettings.py

TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.auth', 
'django.core.context_processors.debug', 
'django.core.context_processors.i18n', 
'django.core.context_processors.media', 
'your_app.context_processors.last_visited_pages_context_processor', 
) 

好到哪裏去。更多信息在http://www.djangobook.com/en/2.0/chapter09.html

+0

我看到的主要缺點是需要重寫視圖類的'render_to_response'方法,因爲默認情況下,通用視圖使用Context而不是RequestContext對象,儘管它可能是一個好的解決方案。 – eyeinthebrick