2014-12-22 26 views
0

在我的網絡應用程序中,我有一個搜索功能,實際上是根據選定的月份和年份搜索數據。我使用簡單的日期和年份選擇下拉菜單。但不能在我的搜索結果模板中渲染所選月份的名稱。也就是說,如果我選擇1月份,那麼其實際上返回值1,而不是返回名稱月。現在這是我的下拉菜單選擇月份和年份來搜索項目。django我怎樣才能從一個下拉列表中返回模板中的月份名稱

<form role="form" method='post' action='{% url 'user_commission_results'%}'> 
      <tr> 
       {% csrf_token %} 

       <td><select name="month" value=""> 

        <option value="1">January</option> 
        <option value="2">February</option> 
        <option value="3">March</option> 
        <option value="4">April</option> 
        <option value="5">May</option> 
        <option value="6">June</option> 
        <option value="7">July</option> 
        <option value="8">August</option> 
        <option value="9">September</option> 
        <option value="10">October</option> 
        <option value="11">November</option> 
        <option value="12">December</option> 
        </select></td> 
        <td><select name="year"> 
        <option value="2010">2010</option> 
        <option value="2011">2011</option> 
        <option value="2012">2012</option> 
        <option value="2013">2013</option> 
        <option value="2014">2014</option> 
        <option value="2015">2015</option> 
        <option value="2016">2016</option> 
        <option value="2017">2017</option> 
        <option value="2018">2018</option> 
        <option value="2019">2019</option> 
        <option value="2020">2020</option> 
        <option value="2021">2021</option> 
       </select></td> 
      <td> 
      <input type='submit' value='search' /> 
      </td> 
      </tr> 
      </form> 

,這是views.py在那裏我有在所選擇的(request.POST)月和年中即並返回作爲上下文變量,以顯示在這裏你可以看到,我已經將所選月份和年份存儲在變量中,並作爲上下文傳遞。

現在我得到的模板,如果我使用{{month}}選定每個月都顯示,它實際上顯示當月不是一個月的值。

舉例來說,如果我選擇March作爲一個月,那麼它會返回值3而不是月份的名稱。我可以理解,它實際上是返回值,導致在我的下拉菜單中,我已經設置對於March.Now月份我的問題是,我怎麼能顯示出一個月,而不是一個月的值的名稱值3?因爲我不能設置值類似的東西

<option value="January">January</option> 
<option value="February">February</option> 
<option value="March">March</option> 
................................ 
................................ 

,因爲我在我的views.py中設置了一個搜索查詢,其中查詢查找月份的值以搜索項目,所以我必須設置值1,2或3 ....月份1月,2月和3月。 .....

更新

根據Blackeagle52的回答,我重寫了我的views.py。

views.py

def user_commission_results(request): 
    month = request.POST.get('month') 
    year = request.POST.get('year') 
    dt = datetime.datetime(year,month,1) 
    verbose_month = dt.strftime('%B') 

    context = RequestContext(request) 
    commission_results = UserCommission.objects.filter(created_time__year=year,created_time__month=month,user=request.user).order_by('-download') 
    total_commission = sum([i.commission for i in commission_results]) 
    return render_to_response('photo/user_commission_results.html',{'commission_results':commission_results,'total_commission':total_commission,'month':verbose_month,'year':year},context) 

,但現在我面對錯誤,

TypeError at /showphoto/user_commission_results/ 
an integer is required 

在行

dt = datetime.datetime(year,month,1) 

回答

1

我將創建一個新DateTime對象,並通過strftime得到它的名字。

import datetime dt = datetime.datetime(int(year), int(month), 1) \ if year and month else datetime.datetime.now() verbose_month = dt.strftime('%B')

編輯: POST變量是字符串,所以我們需要將它們轉換爲int。但要小心,可能會出現年份和/或月份爲空的情況。因此,與內嵌逮住if語句

+0

謝謝您的回答,我已經按照你的答案設置我的views.py代碼,但現在我facting即在線DT「的整數所要求的」錯誤= datetime.datetime(一年,month,1)@ Blackeagle52 – RTan

+0

啊,該死的,我忘了你得到一條g來自你的POST。所以你仍然必須把它變成一個整數。我會編輯我的答案。 – Blackeagle52

+0

是的,我的猜測是正確的,事實上,月份和年份都以字符串形式傳遞。 – RTan

0

你可以做一些喜歡做一個switch語句,其中您再次將該號碼解析爲一個月份名稱。恕我直言,這更像是一個快速和骯髒的解決方案,而不是一個真正的解決方案,但它會做的。

2

考慮使用Calendar API

如果您在選項的值字段中設置數字值,則無法獲取字符串值。

所以,你應該使用例如日曆API得到它你的觀點裏,那就是:

calendar.month_name[1] 
'January' 
2

這樣的顯示事情應該在模板級別進行控制,你也應該用一種形式來生成你的......形式,驗證和顯示錯誤,時將令您的生活更輕鬆好。

如果你把所有的一起,與具有數據庫爲你做的款項一起,你可以用這樣的事情結束了:

import calendar, datetime 

from django.db.models import Sum 
from django.shortcuts import render 
from django import forms 

MONTHS = tuple(zip(range(1,13), (calendar.month_name[i] for i in range(1,13)))) 
YEARS = tuple(zip(range(2010,2022), range(2010,2022))) 

class CalendarPickerForm(forms.Form): 
    month = forms.ChoiceField(choices=MONTHS) 
    year = forms.ChoiceField(choices=YEARS) 


def user_commission_results(request): 
    form = CalendarPickerForm(request.GET or None) 
    if form.is_valid(): 
     year = form.cleaned_data['year'] 
     month = form.cleaned_data['month'] 
     date_obj = datetime.datetime.date(int(year), int(month), 1) 
     objs = UserCommission.objects.filter(created_time__year=year, 
              created_time__month=month, 
              user=request.user).order_by('-download') 
     total_commission = objs.aggregate(total_comm=Sum('commission'))['total_comm'] 

     return render(request, 
         'photo/user_commission_results.html', 
         {'commission_results': objs, 
         'total_commission': total_commission, 
         'date_obj': date_obj}) 
    return render(request, 'search_form.html', {'form': form}) 

在你的模板,可以呈現與該月份名稱date filter

{{ date_obj|date:"F" }} # December 
{{ date_obj|date:"Y" }} # 2014 
+0

我面臨錯誤'元組()採用至多1參數(2給出)'在線路'YEARS =元組(範圍(2010,2022),範圍(2010,2022))' – RTan

+0

糟糕,忘記你需要一個拉鍊在那裏。查看編輯。 –

相關問題