【问题标题】:Django Class Based view calling an other one调用另一个基于 Django 类的视图
【发布时间】:2014-07-21 21:25:57
【问题描述】:

我开发了一个基于类的视图来呈现您可以在下面看到的元素列表:

class ConfirmBeforeRunTest(LoginRequiredMixinRedirect,ListView):
    template_name = "app_testing_house/confirm_before_run.html"
    # Redirect to login page if not auth
    redirect_unauthenticated_users = True

    # Options for ListView
    model = Test

    context_object_name = 'test_list'

    def get_queryset(self):
        return Test.objects.filter()

    def post(self, request, *args, **kwargs):
        return TestToRunPostProcessorView.as_view(request) 

如您所见,我希望能够在我的视图中处理 POST 请求处理,以便为我的查询集获取一些参数。我曾经读过一篇博客说一个 CBV = 一个函数。所以我创建了另一个视图来处理所有的 POST 过程:

class TestToRunPostProcessorView(FormView):
    form_class = TestToRunForm

    def form_valid(self, form):
        # Process form
        return self.render_to_response(context)

    def form_invalid(self, form):
        return self.render_to_response(self.get_context_data(form=form))

不幸的是,它不起作用,我收到以下错误消息:

as_view() takes exactly 1 argument (2 given)

所以我认为return TestToRunPostProcessorView.as_view(request) 不正确,但我不知道为什么..

【问题讨论】:

  • 我不明白你为什么要这样做。如果你的列表视图处理了一些参数,你应该在那个视图中处理,而不是调用另一个。
  • 我正在关注这篇文章的答案:stackoverflow.com/questions/15622354/…。从那以后我改变了主意,决定直接在视图中处理这些数据。

标签: django


【解决方案1】:

函数 .as_view() 本身返回一个视图函数。您必须以这种方式提供参数:

return TestToRunPostProcessorView.as_view()(request)

【讨论】:

    【解决方案2】:

    我认为Listview 没有 post 方法。

    如果您想根据用户输入更改列表,那么您有几个不同的选项。

    例如,如果您根据其类别列出 Test 项目,您可以这样做:

    # urls.py
    ...
        url(regex=r'^category/(?P<category_name>[\w.-]+)/$',
            view=ListByCategory.as_view(),
            name='single_category_list'),
    
    # views.py
    
    class ListByCategory(ListView):
        model = Test
        template_name = 'list_single_category.html'
    
        def dispatch(self, request, *args, **kwargs):
            self.category = get_object_or_404(Category,
                                              category=self.kwargs['category_name'])
    
            return super(ListByCategory, self).dispatch(request, *args, **kwargs)
    
        def get_context_data(self, **kwargs):
            context = super(ListByCategory, self).get_context_data(**kwargs)
            context['category'] = self.category
            return context
    
        def get_queryset(self):
            queryset = super(ListByCategory, self).get_queryset()
            return queryset.filter(category=self.category)
    

    或者,如果您想根据提交的输入过滤查询集,那么在“Two Scoops of Django”一书中有一个很好的例子,我会强烈推荐

    我不会详细介绍所有细节,但您确实添加了以下内容:

    def get_queryset(self):
        queryset = super(ConfirmBeforeRunTest, self).get_queryset()
        q = self.request.GET.get("q")
        if q:
            return queryset.filter(field__contains=q)
        return queryset
    

    我强烈建议您购买这本书。它将更详细地解释它,并为您提供更多有效使用它的选项。

    【讨论】:

      【解决方案3】:

      这里是一些示例代码:

      deprecated_urls = {
         'blog-v1-old-slug': BlogIndexView.as_view(),
         'blog-v2-old-slug': BlogIndexView.as_view(),
      }
      
      def route_slug_url(request, slug):
          # 1) match with Node (dynamic slug)
          try:
              nodeslug = NodeSlug.objects.get(slug=slug)
              return BlogNodeView.as_view()(request, node=nodeslug.node)
          except NodeSlug.DoesNotExist:
              pass
      
          # 2) match with NodeAuthor (dynamic slug)
          try:
              author = NodeAuthor.objects.get(slug=slug)
              return BlogAuthorView.as_view()(request, author=author)
          except NodeAuthor.DoesNotExist:
              pass
      
          # 3) match with deprecated URL (hard-coded)
          try:
              view = deprecated_urls[slug](request, slug=slug)
              return view
          except KeyError:
              pass
      
          return serve_404_response(request)
      
      # at end of urls.py, add catch-all for matching slugs
      urlpatterns += patterns('', 
          # How to reconcile with local slugs and node slugs?
          url(r'^(?P<slug>[-\w\/\s]+)/$', route_slug_url, name='build-slug'),
      )
      

      【讨论】:

        猜你喜欢
        • 2018-12-11
        • 2013-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多