django-autocomplete-light – как вернуть поле, отличное от первичного ключа модели?

Я использую django-autocomplete-light

в форме для модели я хочу использовать автозаполнение в одном из ее полей. поле не является внешним ключом или чем-то еще, а просто целочисленным полем, и для автозаполнения я действительно хотел бы использовать ту же модель, что и форма, которую я заполняю.

Однако набор запросов из автозаполнения возвращает идентификатор, и я хочу заполнить поле «номер проекта».

Любая подсказка, как я могу настроить автозаполнение, чтобы оно возвращало не первичный ключ модели, а какое-то другое поле?

также кажется, что я получаю проводной сбой из-за хрустящих форм, когда я использую виджет автозаполнения для целочисленного поля.

модели.py

class KombiPublikation(models.Model):
    typid = models.ForeignKey('KombiPublikationsTypMedium', verbose_name='Outputtyp', db_column='typid') # publikationstyp.id or publikationstypinfo.typid
    [...]
    projektnummer = models.IntegerField(verbose_name='Projektnr.', default=0, blank=True)
[...]

просмотры.py

class SearchProjectinFormAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        qs = KombiPublikation.objects.filter(typid__in=[222, 223, 224]).filter(zeigen=1)

        if self.q:
            qs = qs.filter(Q(projektnummer__contains=self.q))

        return qs

формы.py

class KombiPublikationForm(forms.ModelForm):

    class Meta:
        model = KombiPublikation
        #fields = []
        exclude = ['pub_sprache']
        widgets = {
            'typid': autocomplete.ModelSelect2(url='output:typ-autocomplete', forward=['typtyp']),
            'projektnummer': autocomplete.ModelSelect2(url='output:projekt-form-autocomplete'),
        }

person teconomix    schedule 06.10.2016    source источник


Ответы (2)


Я нашел ответ.

На самом деле вам нужно переопределить get_result_value из базового автозаполнения. Select2QuerySetView, чтобы вернуть нужную переменную из результирующего объекта. :)

Тем не менее, я все еще не могу использовать виджет автозаполнения в моей хрустящей форме - открыл для этого новый вопрос (см. queryset-error-when-adding-a-autocomplete-field"> объект list не имеет атрибута 'queryset' error при добавлении поля автозаполнения в форму модели)

def get_result_value(self, result):
    """Return the value of a result."""
    return result.pk #change pk to the variable of your choice
person teconomix    schedule 14.10.2016

Я думаю, что вы делаете запрос из класса KombiPublikationForm в forms.py, а не из BasePublikation в models.py, попробуйте

class SearchProjectinFormAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        qs = BasePublikation.objects.filter(typid__in=[222, 223, 224]).filter(zeigen=1)

        if self.q:
            qs = qs.filter(projektnummer__contains=self.q)

        return qs

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

Надеюсь это поможет!!

--редактировать--

Попробуйте избавиться от оператора Q: qs = qs.filter(projektnummer__contains=self.q)

person Javier Llamas    schedule 10.10.2016
comment
Извините моя ошибка. Базовая публикация — это абстрактный базовый класс, содержащий поле. Я хотел оградить свой вопрос от этой ненужной сложности. Только забыл переименовать соответственно. - person teconomix; 12.10.2016