Django ModelChoiceField использует отличные значения от одного атрибута модели - PullRequest
3 голосов
/ 15 июля 2011

, поэтому я работаю над приложением django, где у меня есть модель Event.Каждое событие имеет некоторые атрибуты, скажем, одним из них является «имя хоста» (которое я буду использовать повсеместно в качестве примера).Мне нужно реализовать функцию поиска, где пользователь может искать все события, которые имеют имя хоста == some_value, например имя хоста == "myhost.foo.bar".

Теперь я хотел позволить пользователю выбирать средидопустимые параметры (т. е. имена хостов, которые фактически существуют в одном или нескольких событиях) в поле со списком в форме поиска, поэтому я использую 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)
    ...

Однако это дает дубликаты, поскольку многие события могут иметь одно и то же имя хоста.Я попытался использовать «Different ()» в наборе запросов, но, конечно, это не сработает, потому что объекты различны (даже если отображаемые значения не являются).

Итак, я попытался вместо этого выбрать только значенияМне нужно:

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)

Это работает, НО этот список заполняется только один раз, поэтомуне в курсе с базой данных.

Итак ... Есть ли хороший способ решения этой проблемы?Напомним вопрос: КАК мне заполнить поле со списком отличительными значениями от одного из полей модели, а также поддерживать его синхронизацию с базой данных?Я бы подумал, что ModelChoiceField был бы лучшим выбором, если бы я мог заставить его проверять при использовании .values ​​(...) или .values_list (...).

С уважением, Hallgeir

1 Ответ

7 голосов
/ 15 июля 2011

Второй способ будет работать, но вам нужно установить варианты на init , чтобы он обновлялся при каждом вызове формы.

например

class QueryForm(forms.Form):
    hostname = forms.ChoiceField(choices=[], required=False)

    def __init__(self, *args, **kwargs):
        super(QueryForm, self).__init__(*args, **kwargs)
        self.fields['hostname'].choices = Event.objects.all().values_list("hostname","hostname").distinct()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...