django 1.3 - 为基于类的视图定义可选参数的正确方法

时间:2012-03-04 23:24:41

标签: python django django-views parameter-passing django-urls

我只是在基于课堂的观点上弄脏了。

将可选参数的默认值传递给基于类的视图的正确方法是什么? 例如我之前做过这样的事情:
http://lethain.com/using-optional-parameters-in-django-urls/

现在我不太确定如何在基于类的视图中实现相同的效果。即如何在视图中定义类,urls.py中的条目应该是什么样的,以及如何为可选参数定义默认值?

3 个答案:

答案 0 :(得分:4)

url参数存储在self.argsself.kwargs中。基于泛型类的视图文档的dynamic filtering部分中有一些示例。

您可以通过including extra options in your url pattern传递默认参数,或者只是在从self.kwargs获取值时在视图中设置默认值。

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

答案 1 :(得分:1)

对于那些碰巧在看这个问题的人来说,这就是我最终在1.3中所做的。它与我以前在1.1中所做的几乎相同(除了更详细)。 (即如我的问题中的链接所述)

例如urls.py中的相关行可能看起来像

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

在上面的ObjEditView类中,我们可能有类似的东西

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

作为我在上述评论中向Alasdair提出的问题的必然结果,类中各种函数的执行顺序通常对应于它们在文档中的顺序。即在UpdateView中get_object()出现在get_initial()

之前

答案 2 :(得分: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

然后在您的模板中,您可以使用{{param1}}和{{param2}}个对象。

我是新手,所以如果有更好的方法,请随意破解。