在django视图中按月过滤

时间:2014-09-21 06:08:40

标签: python django

我是Django和Python的新手,这将是一个非常基本的问题。

我正在尝试在我的django powered app中添加全文搜索机制时遇到问题。

搜索机制的说明                                                                                             我有一个 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 的正确方法吗?如果是,那我在这里做了什么错?

更新: 我错了,我在视图中的Filter参数中使用了点(。)

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'

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

2 个答案:

答案 0 :(得分:1)

您不能在参数名称中使用点,因此此部分UserCommission.objects.filter(created_time.month=year)会导致SyntaxError  所以你必须将它改为UserCommission.objects.filter(created_time__month=year)

了解更多信息,请阅读Django网站中的 exac

Django网站说

  

在MySQL中,数据库表的“排序规则”设置确定精确比较是否区分大小写。这是一个数据库设置,而不是Django设置。可以将MySQL表配置为使用区分大小写的比较,但需要进行一些权衡。对于m   有关此问题的信息,请参阅collation section文档中的databases

对于上一个错误,您可以更改模板中输入的值:

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

答案 1 :(得分:1)

问题是django存储和检索的月份是月份号码而不是月份名称。这有很多原因,但其中一个基本原因是您可能正在开发多种语言的网站,因此更容易存储数字,然后根据用户的语言显示1月,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但您实际上是在发送月份,并相应地重命名。