2

我有两个模型:导演和电影。

我想创建一个网络查询表单,以便用户可以搜索“1990 年至 1998 年间导演‘史蒂文·斯皮尔伯格’的所有电影”之类的内容。

只是好奇最好和最简单的方法是什么?

谢谢,

4

3 回答 3

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

另请阅读有关从字符串创建日期时间对象的内容

编辑:哦,我忘记了 urls.py 和实际形式:)

在您的 url.py 中,在 urlpatterns 中添加类似的内容。

url(r'^search/$', 'myapp.views.search'),

现在实际的搜索表单必须是这样的:

<form method='GET', action='/search/'>
... your fields
</form>

如果您愿意,可以通过 django 表单生成它。无论如何,我猜这不会让你走得太远。如果你正在做任何严肃的事情,你可能会看看haystack

于 2012-04-30T20:50:26.437 回答
1

嗯。我不相信任何这样的实用程序存在。如果有一个反向的ModelForm就好了。它将查看字段类型并获取搜索表单的每个字段的数据范围。

我认为现在你被困在创建一个文本框和一个日期选择器范围。并在视图中处理该数据。

于 2012-04-30T19:47:07.900 回答
0

听起来您想让您的用户执行“多面”搜索。Django Haystack会让你这样做。他们的文档包含有关faceting的信息。

于 2012-04-30T21:48:09.027 回答