[英]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.