Форум сайта python.su
Приветствую.
Передо мной стоит задача сделать красивый поиск с использованием джанги.
models.py:
class Film(models.Model):
...
producer=models.ForeignKey(Producer)
genre=models.ForeignKey(Genre)
year=models.ForeignKey(Year)
quality=models.ForeignKey(Quality)
date=models.DateField(auto_now_add=True)
....
class Producer(models.Model):
...
class Year(models.Model):
...
class Quality(models.Model):
...
class Genre(models.Model):
...
Офлайн
Мне вот только что подсказали что нужен “фасетный поиск” (haystacksearch.org)
Как можно без использования левых приложений сделать тоже самое? Я еще не смотрел но подозреваю что даже 10 части того то запихано в haystack мне не нужно. Да и использовать сторонние приложения не желательно в данном случае.
Офлайн
Вы код покажите, какой вы написали и в котором “возникает проблема”.
По описанию задачи вполне должен подойти обычный filter.
Офлайн
Daevaorn
Вы код покажите, какой вы написали и в котором “возникает проблема”.
class Producer(models.Model):
name=models.CharField(max_length=255)
def __unicode__(self):
return self.name
class Year(models.Model):
year=models.CharField(max_length=4)
def __unicode__(self):
return self.year
class Quality(models.Model):
quality=models.CharField(max_length=10)
def __unicode__(self):
return self.quality
class Genre(models.Model):
genre=models.CharField(max_length=10)
def __unicode__(self):
return self.genre
class Film(models.Model):
name=models.CharField(max_length=255)
orig_name=models.CharField(max_length=255)
producer=models.ForeignKey(Producer)
genre=models.ForeignKey(Genre)
year=models.ForeignKey(Year)
description=models.TextField()
quality=models.ForeignKey(Quality)
translation=models.CharField(max_length=255)
actors=models.CharField(max_length=255)
cover=ImageWithThumbsField(upload_to="uploads/", sizes=((550,435),(1024,768),))
filesize=models.CharField(max_length=10)
date=models.DateField(auto_now_add=True)
tags=models.ManyToManyField(Tag)
file=models.FileField(upload_to=("uploads/%s/%s/%s/" % (d.year, d.month, d.day)))
duration=models.CharField(max_length=30)
audio=models.CharField(max_length=255)
video=models.CharField(max_length=255)
published=models.BooleanField(default=True)
rating=models.CharField(max_length=255, blank=True, null=True)
servers=models.CharField(max_length=255, editable=False, blank=True, null=True)
def __unicode__(self):
return self.name
<div class="adv_search">
{{hello}}
<form action="/advanced_search/" method="POST">
<p>
<strong>Качество</strong><br>
<select name="quality">
<option></option>
{%for quality in qualities%}
<option>{{quality.quality}}</option>
{%endfor%}
</select>
<input type="submit" value="Искать">
</p>
<hr>
<p>
<strong>Год выпуска</strong><br>
<select name="year">
<option></option>
{%for year in years%}
<option>{{year.year}}</option>
{%endfor%}
</select>
<input type="submit" value="Искать">
</p>
<hr>
<p>
<strong>Режисер:</stong><br>
<select name="producer">
<option></option>
{%for producer in producers%}
<option>{{producer.name}}</option>
{%endfor%}
</select>
<input type="submit" value="Искать">
</p>
<hr>
<p>
<strong>Жанр:</stong><br>
<select name="genre">
<option></option>
{%for genre in genres%}
<option>{{genre.genre}}</option>
{%endfor%}
</select>
<input type="submit" value="Искать">
</p>
<hr>
<p>
<strong>Актер:</stong><br>
<input type="text" name="actor">
<input type="submit" value="Искать">
</p>
<hr><hr><hr>
<p>
{%if results %}
{%for result in results%}
<p><a href="/view/film/{{result.id}}">{{result.name}}</a> | {{result.quality}} | {{result.year}} | {{result.genre}} | {{result.producer}}</p>
{%endfor%}
{%endif%}
</p>
</form>
</div>
Отредактировано (Фев. 3, 2010 16:45:12)
Офлайн
pochechyevКороче, проблема в том что не известно какие поля будут пользователем заполнены, то бишь по каким он будет искать? В таком случае как обычно надо полученный запрос проверять (что заполнено и что нет) и формировать итоговый запрос к базе, хоть в filter, хоть sql, это уже не суть важно.
Ни одно из полей формы НЕ является обязательным.
Не могу обьяснить по-человечески, постарайтесь понять как есть
Офлайн
Передо мной стоит задача сделать красивый поиск с использованием джанги.Для красивого поиска можно и Sphinx прикрутить, чтобы поиск полнотекстовым был.
search = File.objects.all()
producer = form.POST.get("producer", None)
if producer: search = search.filter(producer__name=producer)
Офлайн
magasoftИменно это и нужно.
Короче, проблема в том что не известно какие поля будут пользователем заполнены, то бишь по каким он будет искать?
magasoftНе круто :) слишком много if else получается. Легко запутаться.
В таком случае как обычно надо полученный запрос проверять (что заполнено и что нет) и формировать итоговый запрос к базе, хоть в filter, хоть sql, это уже не суть важно.
magasoftЭто я сейчас так обошел решение вопроса. Поиск сейчас происходит только по одному полю.
Только я не понял зачем вам столько сабмитов в форме?
sairusПрикручивания сторонних приложений хотелось бы избежать.
Для красивого поиска можно и Sphinx прикрутить, чтобы поиск полнотекстовым был.
sairusСейчас где-то так и происходит.
а вообще примерно так должно быть во views.py
sairusЧто именно не django way ?
потому что ваш подход не для Django.
Офлайн
Не круто smile слишком много if else получается. Легко запутаться.Цикл?
Офлайн
FerromanНе понимаю как такое реализовать в цикле. Можно пример?
Цикл?
Офлайн
Проверки списка однотипных элементов в цикле?
Офлайн