我正在开始一个新的应用程序,我正在尽力接受基于类的视图 . 啊,成长的痛苦 . 我试图在这里从GET变量做一个简单的过滤器,如果它不存在我想返回由id desc排序的所有对象,如果是,我想过滤,排序并返回过滤后的列表 .
我写了30行代码来做这件事,所以我一定做错了,对吧?我尝试重写get_queryset(),现在我想起来了,也许我应该在get_queryset()中调用self.request.GET ['search']来进行这种过滤 . 有没有一种标准的方法来实现这一目标?
class MyModelList(AdminPageMixin, ListView):
model = MyModel
context_object_name = 'object'
template_name = 'template/list.html'
def get(self, request, *args, **kwargs):
if 'search' in request.GET and len(request.GET['search']):
search = request.GET['search']
self.object_list = MyModel.objects.filter(advertiser__name=search).orderby('-id')
context = self.get_context_data(object_list=self.object_list, search=search)
else:
self.object_list = MyModel.objects.all()
context = self.get_context_data(object_list=self.object_list).orderby('-id')
return self.render_to_response(context)
def get_context_data(self, **kwargs):
context = super(MyModelList, self).get_context_data(**kwargs)
form = MyModelForm
try:
context['search'] = kwargs['search']
except KeyError:
pass
context['form'] = form
context['form_action'] = reverse('mymodel-add')
context['form_display'] = 'hide'
context['form_save_label'] = 'Add'
return context
其次,为了使问题复杂化,我有一个CreateView和一个UpdateView,我想分享我的ListView的get()或get_queryset()和get_context_data()方法 . 我确信使用Mixin是可能的,但同样,我正在寻找一种标准化的方法 . 建议?这是CreateView,我想在其中共享ListView的方法 .
class MyModelAdd(AdminPageMixin, CreateView):
model = MyModel
form_class = MyModelForm
context_object_name = 'object'
template_name = 'templates/list.html'
def get_success_url(self):
return reverse('mymodel-list')
def get_context_data(self, **kwargs):
context = super(MyModelAdd, self).get_context_data(**kwargs)
context['form_action'] = reverse('mymodel-add')
context['form_display'] = 'show'
context['object_list'] = MyModel.objects.all()
return context
def form_invalid(self, form):
form = MyModelForm(self.request.POST)
context = self.get_context_data()
context['form'] = form
context['form_action'] = reverse('mymodel-add')
context['form_display'] = 'show'
context['form_save_label'] = 'Add'
return render(self.request, 'templates/list.html', context)
2 回答
首先,你的观察是正确的:你绝对应该使用
get_queryset
来过滤列表 . 我建议采取以下措施:其次,如果你真的需要在List和其他视图之间重用代码,你最好编写一个单独的函数而不是使用mixin .
附注:您的表单中不需要
form_action
URL;只需设置action=""
,它将POST到同一个URL .最好的方法是过滤'get_context_data'中的数据 .