我只是在基于课堂的观点上弄脏了。
将可选参数的默认值传递给基于类的视图的正确方法是什么?
例如我之前做过这样的事情:
http://lethain.com/using-optional-parameters-in-django-urls/
现在我不太确定如何在基于类的视图中实现相同的效果。即如何在视图中定义类,urls.py中的条目应该是什么样的,以及如何为可选参数定义默认值?
答案 0 :(得分:4)
url参数存储在self.args
和self.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}}个对象。
我是新手,所以如果有更好的方法,请随意破解。