3

だから私はモデルイベントを持つdjangoアプリケーションに取り組んでいます。各イベントにはいくつかの属性があり、そのうちの 1 つが「ホスト名」です (これを例として使用します)。ユーザーが hostname == some_value を持つすべてのイベントを検索できる検索機能を実装する必要があります (例: hostname == "myhost.foo.bar")。

ここで、ユーザーが検索フォームのコンボボックスで有効なオプション (つまり、1 つ以上のイベントに実際に存在するホスト名) から選択できるようにしたいので、フォームに ModelChoiceFields を使用します。正しいラベルを表示するための ModelChoiceView のサブクラス:

class HostnameModelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
    return obj.host.hostname

私のフォーム:

class QueryForm(forms.Form):
    hostname = HostnameModelChoiceField(queryset=Event.objects.all(), required=False)
    ...

ただし、多くのイベントが同じホスト名を持つ可能性があるため、重複が発生します。クエリセットで「distinct()」を使用しようとしましたが、オブジェクトが異なるため(表示された値が異なる場合でも)、もちろん機能しません。

そのため、代わりに必要な値のみを選択しようとしました。

class QueryForm(forms.Form):
    hostname = ModelChoiceField(queryset=Event.objects.all().values_list("hostname", "hostname").distinct(), required=False)

しかし、これは検証されません! 値が実際の Event インスタンスではなく、単なる文字列値であるためと思われます。

だから私は通常の ChoiceField を試しました:

hostname = forms.ChoiceField(choices=Event.objects.all().values_list("hostname", "hostname").distinct(), required=False)

これは機能しますが、このリストは一度しか入力されないため、データベースで最新ではありません.

それで...この問題を解決する良い方法はありますか? 質問を要約すると、モデルのフィールドの 1 つから個別の値をコンボ ボックスに入力し、データベースとの同期を維持するにはどうすればよいですか? .values(...) または .values_list(...) を使用するときに検証できるのであれば、ModelChoiceField が最善の策だと思います。

敬具、ハルゲイル

4

1 に答える 1