У меня есть эта модель:
class Aircraft(models.Model):
model = models.CharField(max_length=64, blank=True)
type = models.CharField(max_length=32)
extra = models.CharField(max_length=32, blank=True)
manufacturer = models.CharField(max_length=32)
engine_type = models.IntegerField("Engine Type", choices=ENGINE_TYPE, default=0)
cat_class = models.IntegerField("Category/Class", choices=CAT_CLASSES, default=1)
И у меня есть страница «Найти самолет», где пользователю предоставляется форма, в которой он может вводить данные, которые будут использоваться для поиска всех самолетов, которые соответствуют его критериям. Например, пользователь может ввести «Боинг» в текстовое поле и «Джет» в поле engine_type
, и он отобразит все самолеты Боинг в базе данных. То, как я делаю это сейчас, с помощью этой формы:
class AircraftSearch(ModelForm):
search = forms.CharField(max_length=100, required=False)
class Meta:
model = Aircraft
fields = ('engine_type', 'cat_class', )
И затем (излишне сложное) представление, которое преобразует данные из этой формы в набор filter()
, которые добавляются к Aircraft.objects.all()
. (Вместо того, чтобы иметь 4 отдельных поля поиска для каждого CharField, я объединил их все в одно поле поиска.)
Это все работает, но с одной проблемой. Если пользователь хочет исключить тип двигателя из своих критериев поиска, он ввернут, потому что «Любой» не является допустимым выбором для поля типа двигателя. Мне нужно будет создать новое поле / виджет для типа двигателя и категории / класса, включающий «Любой», что в первую очередь побеждает цель использования вида модели
Мне любопытно. Есть ли способ лучше? Это кажется очень распространенной задачей, которая уже была решена кем-то другим, но поиск в Google ничего не дает.