【问题标题】:django 1.3 - Correct way to define optional parameters for a class based viewdjango 1.3 - 为基于类的视图定义可选参数的正确方法
【发布时间】:2012-03-22 12:34:13
【问题描述】:

我只是在接触基于类的视图。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢@Alasdair。如果我走在我的视图中设置默认值的路线,那么在哪里放置这个合适的地方?我想标准化我在哪里进行变量初始化。例如get_queryset、get_context_data 还是其他地方?
    • 我个人认为应该在需要的方法中初始化变量,而不是全部在一个地方。如果您需要在多个方法中访问变量,请编写方法来获取值(例如,查看基于日期的视图中的get_year)。如果您真的想在一个地方初始化所有变量,那么我认为您需要覆盖dispatch 以保证您可以访问所有方法中的变量
    • 是的,我不想每次都重写调度只是为了初始化变量。文档中是否有某处讨论了各种功能的执行顺序?例如dispatch 然后 get_queryset 然后 get_context_data 然后等等......或者我是否必须为此寻找代码?谢谢!
    【解决方案2】:

    与这个问题有点相关。我一直在寻找如何使用基于类的视图来获取 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 }} 对象可供您使用。

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

    【讨论】:

      【解决方案3】:

      对于那些碰巧看到这个问题的人,这就是我最终在 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
      

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

      【讨论】:

        猜你喜欢
        • 2017-10-08
        • 1970-01-01
        • 2023-04-08
        • 2019-05-29
        • 2013-01-03
        • 2012-03-11
        • 1970-01-01
        • 2015-12-04
        • 2015-04-30
        相关资源
        最近更新 更多