2012-03-04 58 views
3

我只是用基於類的視圖弄髒了我的手。django 1.3 - 爲基於類的視圖定義可選參數的正確方法

什麼是將可選參數的默認值傳遞給我的基於類的視圖的正確方法?
比如我以前幾乎是這樣:
http://lethain.com/using-optional-parameters-in-django-urls/

現在我不太確定如何實現基於類的觀點相同的效果。即如何在視圖中定義類,urls.py中的條目應該是什麼樣的,以及如何爲可選參數定義默認值?

回答

4

url參數存儲在self.argsself.kwargs中。基於泛型類的視圖文檔的dynamic filtering部分中有一些示例。

您可以通過including extra options in your url pattern傳遞默認參數,或者在從self.kwargs獲取值時在視圖中設置默認參數。

my_value = self.kwargs.get('key', 'default_value') 
+0

謝謝@Alasdair。如果我在我的視圖中設置默認路線,那麼放置該位置的適當位置在哪裏?我想標準化我在哪裏做變量初始化。例如, get_queryset,get_context_data,別的地方? – 2012-03-05 16:49:00

+0

我個人認爲你應該在需要它們的方法中初始化變量,而不是全部在一個地方。如果您需要通過多種方法訪問變量,請編寫方法以獲取值(例如,在基於日期的視圖中查看'get_year')。如果你真的想在一個地方初始化所有的變量,那麼我認爲你需要重寫'dispatch'來保證你可以在所有方法中訪問變量 – Alasdair 2012-03-05 17:41:33

+0

是的,我寧願不要每次都重寫dispatch來初始化變量。文檔中是否存在關於各種功能的執行順序的地方?例如然後派遣然後get_queryset然後get_context_data然後等... 或者我必須通過代碼尋找? 謝謝! – 2012-03-05 18:50:51

0

與此問題有點相關。我一直在尋找如何使用基於視圖的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

對於那些碰巧在看這個問題的人,這裏是我最終在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()

相關問題