在Django中,我正在编写一个视图,该视图处理来自页面index.html的GET请求,并将请求呈现给另一个页面match_listing.html。页面index.html有许多复选框可用于修改match_listing.html上显示的数据。
目前,我的代码询问GET请求以确定每个复选框的值,然后将这些复选框添加到呈现给页面match_listing的上下文中。这种方法显然是“单一的”并且不令人满意。任何人都可以建议我如何改进我的代码吗?
from django.shortcuts import render
from .models import Pl1516
from .parse import parse_load
def index(request):
if not request.GET.get('hometeam'):
return render(request, 'main/index.html')
else:
hometeam_filter = request.GET.get('hometeam')
ht_filter = request.GET.get('HT')
htr_filter = request.GET.get('HTR')
ftr_filter = request.GET.get('FTR')
matches = Pl1516.objects.filter(hometeam=hometeam_filter)
if matches.count() < 19:
parse_load(hometeam_filter)
context_dict = {'ht_filter': ht_filter, 'ftr_filter': htr_filter, 'htr_filter': htr_filter, 'matches' : matches}
return render(request, 'main/match_listings.html', context_dict)
答案 0 :(得分:0)
可能有更好的方法来做到这一点,但我在一个类似的实例中使用字典理解来一次完成:
safe_get_params = { k: v for k, v in request.GET.items() if k in ['HT', 'HTR', 'FTR'] }
因为看起来你正在使用&#39; _filter&#39;来修改密钥。附加后,如有必要,您可以修改如下:
context_dict = { (k.lower() + '_filter'): v for k, v in request.GET.items() if k in ['HT', 'HTR', 'FTR'] }
然后,您可以添加matches
密钥:
context_dict['matches'] = matches
你快乐的方式。
答案 1 :(得分:0)
所以,你有两个观点:
index.html
match_listings.html
这看起来像是我的常规URL路由。
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^ht-(?P<hometeam>\w+)/$', views.MatchListView.as_view(), name='match_list'),
]
在客户端,不是追加查询字符串,而是调用其他URL。或者,如果您仍需要支持查询字符串url:
class IndexView(TemplateView):
template_name = 'main/index.html'
def get(self, request, *args, **kwargs):
hometeam = request.GET.get('hometeam', None)
if hometeam:
return HttpResponseRedirect(reverse('match_list', kwargs={'hometeam': hometeam}, permanent=True)
return super().get(request, *args, **kwargs)
class MatchListView(ListView):
template_name = 'main/match_listings.html'
model = Pl1516
# paginate_by = 20
context_object_name = matches
def get_queryset(self, queryset=None):
qs = super().get_queryset()
hometeam = self.kwargs['hometeam']
qs = qs.filter(hometeam=hometeam_filter)
if qs.count() < 19:
# is this pagination? what is this doing?
parse_load(hometeam_filter)
return qs
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx.update({
'ht_filter': self.request.GET.get('HT', None),
'ftr_filter': self.request.GET.get('FTR', None),
'htr_filter': self.request.GET.get('HTR', None)
})
return ctx
如果parse_load
真的有分页,可以考虑在内置分页中使用Django(你应该尽可能使用Django)。
通用视图中有许多好东西,imho,起初可能不那么明显。当URL变量没有DB条目,分页等时自动返回404。