我只是用基於類的視圖弄髒了我的手。django 1.3 - 爲基於類的視圖定義可選參數的正確方法
什麼是將可選參數的默認值傳遞給我的基於類的視圖的正確方法?
比如我以前幾乎是這樣:
http://lethain.com/using-optional-parameters-in-django-urls/
現在我不太確定如何實現基於類的觀點相同的效果。即如何在視圖中定義類,urls.py中的條目應該是什麼樣的,以及如何爲可選參數定義默認值?
我只是用基於類的視圖弄髒了我的手。django 1.3 - 爲基於類的視圖定義可選參數的正確方法
什麼是將可選參數的默認值傳遞給我的基於類的視圖的正確方法?
比如我以前幾乎是這樣:
http://lethain.com/using-optional-parameters-in-django-urls/
現在我不太確定如何實現基於類的觀點相同的效果。即如何在視圖中定義類,urls.py中的條目應該是什麼樣的,以及如何爲可選參數定義默認值?
url參數存儲在self.args
和self.kwargs
中。基於泛型類的視圖文檔的dynamic filtering部分中有一些示例。
您可以通過including extra options in your url pattern傳遞默認參數,或者在從self.kwargs
獲取值時在視圖中設置默認參數。
my_value = self.kwargs.get('key', 'default_value')
與此問題有點相關。我一直在尋找如何使用基於視圖的URL添加一些額外的上下文。你可以做這樣的事情:
url(r'^param1/(?P<param1>\d+)/param2/(?P<param2>\d+)/$', ClassDetailView.as_view())
,然後在您的視圖:
def get_context_data(self, **kwargs):
context = super(ClassDetailView, self).get_context_data(**kwargs)
context['param1'] = Model.objects.get(pk=self.kwargs['param1'])
context['param2'] = Model.objects.get(pk=self.kwargs['param2'])
return context
然後在你的模板,你將有{{}參數1}和{{參數}}對象提供給您。
我對此很陌生,所以如果有更好的方法可以隨意對此進行破解。
對於那些碰巧在看這個問題的人,這裏是我最終在1.3中做的事情。這與我在1.1中用它的方式非常相似(除了更詳細的內容)。 (即如我的問題中的鏈接所述)
例如,在urls.py相關的行可能類似於上述ObjEditView類的情況下
...
# pass a default value of page = 1 for optional parameter page
url(r'^obj/list$', ObjListView.as_view(), {'page': 1}, name='obj_list'),
url(r'^obj/list/page(?P<page>[0-9]+)$', ObjListView.as_view(), name='obj_list'),
...
# both new and edit use the same class, but edit obviously needs an id for the object.
# i should probably just be using pk but whatever.
url(r'^obj/new$', ObjEditView.as_view(), name='obj_edit'),
url(r'^obj/edit/(?P<obj_id>[0-9]+)/$', ObjEditView.as_view(), name='obj_edit'),
,我們可能有這樣的事情
class ObjEditView(UpdateView):
...
form_class = ObjForm
model=Obj
...
# this puts our obj in self.object
def get_object(self):
# if the obj exists, intialize our variables with values from the obj instance
# if it is a new obj, intialize accordingly
try:
obj = Obj.objects.get(id = self.kwargs['obj_id'])
except (KeyError, ObjectDoesNotExist):
obj = Obj()
return obj
其必然結果是我的問題,以麥金太爾在上述評論,類中各種函數的執行順序通常與它們在文檔中的順序相對應。即在UpdateView中獲得get_object()之前get_initial()
謝謝@Alasdair。如果我在我的視圖中設置默認路線,那麼放置該位置的適當位置在哪裏?我想標準化我在哪裏做變量初始化。例如, get_queryset,get_context_data,別的地方? – 2012-03-05 16:49:00
我個人認爲你應該在需要它們的方法中初始化變量,而不是全部在一個地方。如果您需要通過多種方法訪問變量,請編寫方法以獲取值(例如,在基於日期的視圖中查看'get_year')。如果你真的想在一個地方初始化所有的變量,那麼我認爲你需要重寫'dispatch'來保證你可以在所有方法中訪問變量 – Alasdair 2012-03-05 17:41:33
是的,我寧願不要每次都重寫dispatch來初始化變量。文檔中是否存在關於各種功能的執行順序的地方?例如然後派遣然後get_queryset然後get_context_data然後等... 或者我必須通過代碼尋找? 謝謝! – 2012-03-05 18:50:51