2012-09-26 66 views
0

我正在使用Django v1.4,我试图继承泛型ListView视图。下面的代码继承Django ListView

from django.views.generic import ListView 

class SearchListView(ListView): 
    model = None 
    fields = None 

    def get_queryset(self): 
     #...etc... 
     return super(SearchListView, self).get_queryset() 

然后,我将进一步自定义视图特定型号:

class PersonSearchListView(SearchListView): 
    model = Person 
    fields = ['first_name', 'last_name'] 

那么什么情况是,ImproperlyConfigured例外是说明超(ListView控件),要么模型或查询集应被定义。我以为我是......(model = Person)。为什么这个价值观没有纳入观点?

感谢

+0

也许你可以尝试从SearchListView中删除model = None和fields = None。你可以发布实例化PersonSearchListView的代码吗? 我的猜测是,当初始化PersonSearchListView它首先调用SearchListView构造函数,但是当它构造SearchListView时,模型仍然是None。 –

+0

实例化PersonSearchListView的代码位于urls.py中。 PersonSearchListView.as_view()。原来在SearchListView类中声明模型和字段是OK的。其实,我不知道我做了什么才能使它工作。我的代码充满了失败尝试的评论。我试图让它回到与我上面的示例代码内联,并突然它工作。我在想我有一个类名错别字或urls配置问题。 :) – lingrlongr

+0

是保持你的代码清洁是重要的,它将防止大量的错误,并使查找错误更容易。它会为你节省时间。 –

回答

0

当你调用super(SearchListView, self).get_queryset()

您将调用下面类的get_queryset,你可以看到它会抛出一个异常,如果您没有设置模型或查询集。

ListView是MultipleObjectMixin的子项。

但是,如果你实例化一个PersonSearchListView,模型应该已被正确设置。你可以包含url配置吗?稍后将尝试并更新我的答案。

class MultipleObjectMixin(ContextMixin): 
    """ 
    A mixin for views manipulating multiple objects. 
    """ 
    allow_empty = True 
    queryset = None 
    model = None 
    paginate_by = None 
    context_object_name = None 
    paginator_class = Paginator 

    def get_queryset(self): 
     """ 
     Get the list of items for this view. This must be an iterable, and may 
     be a queryset (in which qs-specific behavior will be enabled). 
     """ 
     if self.queryset is not None: 
      queryset = self.queryset 
      if hasattr(queryset, '_clone'): 
       queryset = queryset._clone() 
     elif self.model is not None: 
      queryset = self.model._default_manager.all() 
     else: 
      raise ImproperlyConfigured("'%s' must define 'queryset' or 'model'" 
             % self.__class__.__name__) 
     return queryset