我是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'
选择一个月(五月)后进行搜索。
答案 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
但您实际上是在发送月份,并相应地重命名。