我能够自己解决这个问题,但没有 django-filter 模块,下面的完整代码。
关键是使用显示表单的标准 django 视图(可以在文档中找到),在表单逻辑之后,我添加了负责显示帖子列表的代码(从行 criteria = {} 开始)
关键部分是将 url 参数的 dict 传递给 2 个模型的两个查询集,并根据 url 参数 'source' 选择要在 postlist 中显示的内容:
if source == 'vk':
items = list(vkposts)
elif source == 'fb':
items = list(fbposts)
else:
items = list(vkposts) + list(fbposts)
如此完整的视图:
def wallpost_list(request, page_number=1):
success = False
project = ''
date_created = ''
text = ''
source = ''
if request.method == 'POST':
postfilter_form = PostfilterForm(request.POST)
if postfilter_form.is_valid():
success = True
project = postfilter_form.cleaned_data['project']
date_created = postfilter_form.cleaned_data['date_created']
#text = postfilter_form.cleaned_data['text']
return redirect('posts/?project=%s&date_created=%s' % (project, date_created))
else:
postfilter_form = PostfilterForm(initial={'project':request.GET.get('project', '3'), 'date_created':request.GET.get('date_created', '3'),})
criteria = {}
last_date = date(2017, 12, 31)
if 'author' in request.GET:
criteria['from_id'] = int(request.GET['author'])
success = True
if 'likes' in request.GET:
criteria['likes.count'] = int(equest.GET['likes']) # {'$in': [int(sex) for sex in request.GET.getlist('sex')]}#int(request.GET['sex']) #/?group=20548110&sex=1&sex=2 # This will return [1,2]
success = True
if 'comments' in request.GET:
criteria['comments.count'] = int(request.GET['comments']) # {'$elemMatch': {'artist': request.GET['music_artist']}}
success = True
if 'project' in request.GET:
#project = Userproject.objects.get(name=self.request.GET['project'])
criteria['project__name'] = request.GET['project']
success = True
if 'sentiment' in request.GET:
criteria['sentiment'] = request.GET['sentiment'] # {'$elemMatch': {'artist': request.GET['music_artist']}}
success = True
if 'date_saved' in request.GET:
criteria['date_saved__range'] = (parse(request.GET['date_saved']).date(), last_date) # 'date': {'$gte': int(time.mktime(date_saved.timetuple()))}
success = True
if 'date_created' in request.GET:
criteria['date_created__range'] = (parse(request.GET['date_created']).date(), last_date) # 'date': {'$gte': int(time.mktime(date_saved.timetuple()))}
success = True
if 'source' in request.GET:
source = request.GET['source']
success = True
print(criteria)
vkposts = Vkwallpost.objects.filter(**criteria).order_by("-date_created")#[:5]
fbposts = Fbpagepost.objects.filter(**criteria).order_by("-date_created")#[:5]
if source == 'vk':
items = list(vkposts)
elif source == 'fb':
items = list(fbposts)
else:
items = list(vkposts) + list(fbposts)
items.sort(key=lambda i: i.date_created, reverse=True)
post_list = items
current_page = Paginator(post_list, 20)
# context['post_list'] = items # post_list это VK + FB posts
# vk = VkwallpostFilter(request.GET, queryset=Vkwallpost.objects.all())
# fb = FbpagepostFilter(request.GET, queryset=Fbpagepost.objects.all())
# items = list(vk) + list(fb)
# items.sort(key=lambda i: i.date_created, reverse=True)
return render_to_response('vk_list.html', {'post_list': current_page.page(page_number), 'postfilter_form': postfilter_form,
'project': project, 'date_created': date_created, 'source': source, 'text': text, 'success': success}
, context_instance=RequestContext(request))