簡體   English   中英

Django:正確使用基於類的View繼承嗎?

[英]Django: correct use of class-based View inheritance?

我希望我的Django項目中的幾乎每個View都可以計算,例如time_on_mars 該變量需要放入每個模板上下文中,因此每個模板都可以繪制time_on_mars 我還希望每個View都可以使用該變量(如果需要),也許可以計算is_it_nighttime_on_mars或其他任何值。 我想使用繼承或其他某種機制來做到這一點,所以當我提供的時間比火星時間多得多時,我就不會重復自己了。

這是否適合使用基於類的視圖? 我想我會創建一個基類視圖,並在其get和post方法中計算火星的當前時間,然后將子類方法稱為“ doGet”或“ doPost”,攔截結果,將火星時間放入結果中,然后繼續。 看起來很乏味。

裝飾員? 有沒有一種方法可以將time_on_mars放入視圖的關閉上下文中?

什么是pythonic(djangonic?)方式?

編輯:我喜歡上下文處理器的想法,但我改變了主意-我希望大多數視圖來代替所有視圖。 尤其是在火星上計算時間非常昂貴時...

編輯2:問題描述不充分! 澄清:

我有很多意見可以做到這一點:

def some_view(request):
   w,x,y,z = provision_wxyz()
   ... some biz logic, maybe compute a,b,c using w,x,y,z ...
   return render(request, 'some_template.html', { 'a':a, 'b':b, 'c':c, 'w':w, 'x':x, 'y':y, 'z':z })

...,我想抽象出第一步(w,x,y,z =),並將w,x,y,z添加到模板上下文中。 上下文處理器不起作用,因為在some_view業務邏輯中,我想訪問w,x,y,z。 我不喜歡在TemplateView上執行CLA的混合策略,因為同樣,它無法讓我訪問some_view(或some_view的等效項)中的w,x,y和z,而我想好吧,在某處有很多業務邏輯,而TemplateView似乎沒有給我那樣的東西?

您絕對可以為此使用CBV。 對於利用Python的多重繼承功能的Mixins來說,這是一個很好的用途。 這是我剛剛寫的一個快速而骯臟的示例。

class MarsMixin(object):
    time_on_mars = 5

    def get_time_on_mars(self):
        """
        Does what it takes to return a time on mars be it calculation
        or returning a property set on the object. Should return a property
        from the object if it is a constant. Should calcualte in the method
        if it is going to be dynanic
        """
        return self.time_on_mars

    def get_context_data(self, **kwargs):
        context = super(MarsMixin, self).get_context_data(**kwargs)
        context['time_on_mars'] = self.get_time_on_mars()
        return context


class HomeView(MarsMixin, TemplateView):
    template_name = 'home/index.html'

最大的注意事項是mixin從對象繼承。 另一個是您從HomeView mixin繼承,它在TemplateView之前列出。

我認為您仍然可以使用上下文處理器,可以提供幫助的技巧是在要進行計算的URL前面加上前綴,例如,它們將以'/ mars / ...'開頭。 您還可以使用另一種前綴。

這樣,您可以檢查上下文處理器方法:

def go_to_mars(request):
    if request.path.startswith('/mars/'):
        return {'time_on_mars': calculate_time_on_mars()}
    return {}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM