在Django视图中,如何呈现获取请求

时间:2016-10-27 14:44:59

标签: python django

在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)

2 个答案:

答案 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)

所以,你有两个观点:

  1. 没有进一步的信息&gt; index.html
  2. hometeam! &GT; match_listings.html
  3. 这看起来像是我的常规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。

    https://docs.djangoproject.com/en/1.10/topics/class-based-views/mixins/#using-singleobjectmixin-with-listview