2016-10-27 46 views
2

在Django中,我正在編寫一個視圖,該視圖處理來自頁面index.html的GET請求並將請求呈現到另一個頁面match_listing.html。 index.html頁面有一些複選框可以修改match_listing.html中顯示的數據。在Django視圖中,如何呈現獲取請求

此刻,我的代碼詢問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

有很可能是一個更好的方式來做到這一點,但我用一本字典的理解類似的情況下做到這一點一氣呵成:

safe_get_params = { k: v for k, v in request.GET.items() if k in ['HT', 'HTR', 'FTR'] } 

因爲它看起來像您正在修改該鍵與「_filter」的規則,你可以修改如下如果需要更低:

context_dict = { (k.lower() + '_filter'): v for k, v in request.GET.items() if k in ['HT', 'HTR', 'FTR'] } 

後,可以再加入matches鍵:

context_dict['matches'] = matches 

而你正在快樂的路上。

+0

嗨布萊恩,非常感謝您的迅速而簡潔的迴應。你的建議直接用於工作,並給我的代碼帶來了更多pythonic光澤!這是我第一次發佈在stackoverflow上 - 一個非常令人鼓舞的迴應! –

+0

@DavidG很高興幫助。如果您覺得這個有用,請隨時爲後人上傳/接受 – brianpck

0

所以,你有兩種觀點,即:

  1. 沒有進一步的信息>index.html
  2. hometeam! >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中有很多好東西,起初可能並不那麼明顯。比如像自動返回404時,URL變量沒有DB項,分頁等

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