2014-07-21 195 views
2

我开发一个基于类的视图渲染元素的列表,你可以看到如下:基于Django的类视图调用的另一个

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)是不正确的,但我不知道为什么..

+1

我不明白你为什么这样做。如果列表视图处理某些参数,则应在该视图中执行此操作,而不是通过调用另一个参数。 –

+0

我正在关注这篇文章的答案:http://stackoverflow.com/questions/15622354/django-listview-with-post-method。从那以后,我改变主意,决定直接在视图中处理这些数据。 –

回答

4

函数.as_view()本身给出了一个视图函数。你必须这样提供参数:

return TestToRunPostProcessorView.as_view()(request) 
1

我不认为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) 

或者,如果您要筛选基于提交输入的查询集再有就是一个很好的例子这本书“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 

我强烈建议你能找到这本书。它会更详细地解释它,并给你更多的选择来有效地使用它。

1

下面是一些示例代码:

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