2012-03-04 11 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、他の場所? –

+0

私は個人的には、必要なメソッドの変数を初期化する必要があると思います。複数のメソッドで変数にアクセスする必要がある場合は、メソッドを作成して値を取得します(たとえば、日付ベースのビューでは 'get_year'を見てください)。すべての変数を1つの場所に初期化したい場合は、すべてのメソッドの変数にアクセスできるようにするために 'dispatch'をオーバーライドする必要があると思います。 – Alasdair

+0

私はむしろ、変数。さまざまな機能の実行順序についてドキュメントのどこかにありますか?例えばディスパッチしてからget_queryset、get_context_dataなどを実行します。 それともコードを捜す必要がありますか? ありがとう! –

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}}、あなたが利用可能な{{PARAM2}}オブジェクトう。

私はこれに新しいので、それを行うより良い方法があれば、これをハックすることを自由に感じてください。

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'), 

ように見えるかもしれません

上記のコメントでAlasdairへの私の質問への当然の結果として
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()の前に来ます。

関連する問題