2014-09-21 80 views
0

我在Django和Python中很新,这将是一个非常基本的问题。在Django视图中按月过滤

我面临的问题,而我试图在我的Django应用程序中添加一个全文搜索机制。

说明的搜索机制 我有一个UserCommission模型,其中手续费数据被存储针对不同类型的用户,显然我UserCommission模型有CREATED_TIME场,这是一个DateTimeField字段。现在我正在尝试针对每个月搜索用户佣金。

这是我的观点文件(仅表格)

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

       <td><select name="year"> 
        <option value="January">January</option> 
        <option value="February">February</option> 
        <option value="March">March</option> 
        <option value="April">April</option> 
        <option value="May">May</option> 
        <option value="June">June</option> 
        <option value="July">July</option> 
        <option value="August">August</option> 
        <option value="September">September</option> 
        <option value="October">October</option> 
        <option value="November">November</option> 
        <option value="December">December</option> 
       </select> 
      </td> 
      <td> 
       <input type='submit' value='search' /> 
      </td> 
     </tr> 
    </form> 

这是我的模型

class UserCommission(models.Model): 
    user = models.ForeignKey(User) 
    created_time = models.DateTimeField('Created Time',auto_now_add=True) 
    commission = models.IntegerField() 

,这是我对搜索

def user_commission_results(request): 
    year = request.POST.get('year') 
    commission_results = UserCommission.objects.filter(created_time.month=year) 

    return render_to_response('photo/user_commission_results.html',{'commission_results':commission_results},context_instance=RequestContext(request)) 

的看法,但我面对出现以下错误,

SyntaxError at/
keyword can't be an expression (views.py, line 154) 

这条线154表示**

commission_results = UserCommission.objects.filter(created_time.month=year) 
我的视图文件的

因为我几乎是一个新手,我无法弄清楚是怎么回事。 在django中创建一个全文seacrh是否正确?如果是,那么我在这里做了什么错误?

UPDATE: 的错误我在做,我是用点的过滤参数在我看来

commission_results = UserCommission.objects.filter(created_time.month=year) 

这实际上导致了错误,现在改成了这样

(。)
commission_results = UserCommission.objects.filter(created_time__month=year) 

,但现在我是一个错误,是

ValueError at /showphoto/user_commission_results/ 
invalid literal for int() with base 10: 'May' 

选择一个月后(5月)进行搜索。

+0

whats'“”'在你视图中的else之后吗?你有一个'SyntaxError'错误! – Kasramvd 2014-09-21 06:14:24

+0

是否导致错误? @卡斯拉 – RTan 2014-09-21 06:17:04

+0

不,我只是问!我认为这个错误是因为'UserCommission.objects.filter'中的''。你会在视图中说出'154'这行吗? – Kasramvd 2014-09-21 06:17:24

回答

1

在参数名称不能使用点所以这部分UserCommission.objects.filter(created_time.month=year)原因SyntaxError 所以你必须将其更改为UserCommission.objects.filter(created_time__month=year)

更多信息在Django网站阅读exac

Django的网站说

在MySQL中,数据库表中的“整理”设置确定确切的比较是否区分大小写。这是一个数据库设置,而不是Django设置。可以将MySQL表配置为使用区分大小写的比较,但涉及一些权衡。有关此信息,请参阅databases文档中的collation section

,并为最后的错误,你可以在你的模板改变您输入的值:

   <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> 
+0

它会是一个双下划线或一个下划线,即created_time__month或created_time_month? – RTan 2014-09-21 06:26:34

+0

必须是双下划线! – Kasramvd 2014-09-21 06:29:15

+0

我已根据您的答案编辑我的代码,然后尝试搜索选择月份** 9月**,但现在我面临此错误** ValueError at/showphoto/user_commission_results/ 无效字面值为int()with base 10:'9月'** – RTan 2014-09-21 06:42:48

1

的问题是,一个储存和Django在检索到的一个月是一个月不是一个月名称。这有很多原因,但其中一个基本原因是您可能正在开发多种语言的网站,因此,更容易存储该号码,然后显示January,Janvier或Januar或enero,具体取决于用户的语言说话。

解决这个问题的最简单方法是更改​​模板,以便值是月数:

<select name="year"> 
    <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> 

您可能还需要考虑的是,名字是year但你实际发送月份,并相应地重命名它。