我有两个模特:导演和电影。
我想创建一个网页查询表单,以便用户可以搜索类似于"所有来自导演&史蒂文斯皮尔伯格的电影'在1990年至1998年之间"。
只是好奇最好和最简单的方法是什么?
谢谢,
答案 0 :(得分:6)
好的,最简单的解决方案是这样的。
我对模型的结构做了一些假设,所以 相应调整。
假设这是我们的models.py
from django.db import models
class Director(models.Model):
name = models.CharField(max_length=128)
# maybe some other fields...
class Film(models.Model):
title = models.CharField(max_length=128)
director = models.ForeignKey(Director)
created_at = models.DateField()
我们天真的views.py 请记住,我故意省略许多健全性检查。
import datetime
from django.shortcuts import render_to_response
from myapp.models import Film
def search(request):
# Suppose we support these params -> ('director', 'fromdate', 'todate')
request_params = request.GET.copy()
fromdate = datetime.datetime.strptime(request_params['fromdate'], 'some-string-format')
todate = datetime.datetime.strptime(request_params['todate'], 'some-string-format')
# Our query is ready to take off.
film_results = Film.objects.filter(
director__name=request_params['director'],
created_at__range=(fromdate, todate)
)
return render_to_response('search_results.html', {'results':film_results})
我们的search_results.html模板
{% extends some_base.html %}
{% if results }
{% for film in results %}
<h3>{{ film.title }}</h3>
<p>Director: {{ film.director.name }}</p>
<p>When: {{ film.created_at }}</p>
{% endfor %}
{% else %}
<p>Sorry no results for your query</p>
{% endif %}
另请阅读this有关从字符串
创建日期时间对象的信息编辑:哦,我忘记了urls.py和实际形式:)
你的url.py中的在urlpatterns中添加这样的内容。
url(r'^search/$', 'myapp.views.search'),
现在实际的搜索表单必须是这样的:
<form method='GET', action='/search/'>
... your fields
</form>
如果您愿意,可以通过django表单生成它。 无论如何,我猜这不会让你走得太远。如果你在做 任何严肃的事你都可以看看haystack
答案 1 :(得分:1)
嗯。我不相信任何这样的实用者存在。如果有一个反向的ModelForm会很好。它将查看字段类型并获取搜索表单的每个字段的数据范围。
我认为现在你不得不创建一个文本框和一个日期选择器范围。并在视图中处理该数据。
答案 2 :(得分:0)
听起来您希望让用户执行“分面”搜索。 Django Haystack会让你这样做。他们的文档包含有关faceting的信息。