私はこのモデルがあります:モデル検索フォームを作成する最も良い方法は?
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)
をそして私は、ユーザーが彼らの基準を満たすすべての航空機を見つけるために使用されるデータを入力することができますフォームが表示され、「航空機を見つける」のページを持っています。たとえば、ユーザーはテキストボックスに「boeing」と入力し、engine_type
ボックスに「jet」を入力すると、データベースにすべてのboeingジェットが表示されます。私は今これをやっている方法は、このフォームである:
class AircraftSearch(ModelForm):
search = forms.CharField(max_length=100, required=False)
class Meta:
model = Aircraft
fields = ('engine_type', 'cat_class',)
そしてAircraft.objects.all()
に追加されますfilter()
年代のセットには、このフォームからのデータを変換する(不コンプレックス)ビュー。 (CharFieldごとに4つの検索フィールドを用意するのではなく、すべてを1つの検索フィールドにまとめました)。
これはすべて問題なく動作します。ユーザーが検索条件からエンジンタイプを除外したい場合は、「Any」がエンジンタイプフィールドの有効な選択肢ではないため、それらはうまくいきません。エンジンの種類とカテゴリ/クラスの新しいフィールド/ウィジェットを作成して、「Any」を含むようにしなければなりません。
私は好奇心が強いです。より良い方法がありますか?これはすでに他の誰かに取り組まれてきた非常に一般的な作業のようですが、Google検索では何も出ません。
問題は、 'choices = ENGINE_TYPE'には「jet」や「piston」などの有効な選択肢だけが含まれ、「Any」ではないことです。そのオプションをENGINE_TYPEリストに追加するか、各SearchFormにオプションの1つが含まれていれば、特定のエンジンタイプでフィルタリングする必要があります。 ENGINE_TYPEリストに "Any"オプションを追加して検索フォームを作成するのは問題ではありませんが、それは私にはハック感があり、より良い "非ハッキー"メソッドが存在するならば、むしろそうするでしょう。 – priestc
choices =(( ''、 'Any')、)+ ENGINE_TYPEのようなことをするのはかなりクリーンな修正だと思う。モデルに「any」は導入されませんが、フォームには使用可能です。 – tghw