вернуть набор запросов для указанных c полей в автозаполнение полей формы - PullRequest
0 голосов
/ 28 января 2020

Я не эксперт по django, поэтому я не уверен, что просто ищу не ту вещь, но я пытаюсь использовать django -autocomplete-light для автозаполнения некоторых полей в форме модели.

У меня есть модель, Животное. Животное имеет несколько полей. Моя цель - создать форму модели с автозаполнением для нескольких из этих полей.

forms.py

class AnimalForm(ModelForm):
class Meta:
    model = Animal
    fields = [
        'myfield'
    ]
    widgets = {
        'myfield': autocomplete.ListSelect2(
            url='myfield-autocomplete')
    }

views.py:

class MyfieldAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        # Don't forget to filter out results depending on the visitor !

        if not self.request.user.is_authenticated:
            return Animal.objects.none()
        qs = Animal.objects.filter().values('myfield')
        if self.q:
            qs = qs.filter(name__istartswith=self.q)
        return qs

Я получаю:

AttributeError: 'dict' object has no attribute 'pk'

Я думаю, потому что Animal.objects.filter (). Values ​​('myfield') возвращает фактические значения, а не набор запросов.

Если я изменю свой набор запросов на:

class MyfieldAutocomplete(autocomplete.Select2QuerySetView):
    def get_queryset(self):
        # Don't forget to filter out results depending on the visitor !

        if not self.request.user.is_authenticated:
            return Animal.objects.none()
        qs = Animal.objects.all()
        if self.q:
            qs = qs.filter(name__istartswith=self.q)
        return qs

Это загружает, и мое поле автозаполнения заполняется полем имени объектов Animal. Вместо имени я хочу иметь возможность указать произвольное поле.

update- ошибка вывода:

[28/Jan/2020 08:02:33] "GET /animals/add HTTP/1.1" 200 47686
C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\views\generic\list.py:88: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'animals.models.Animal'> QuerySet.
  allow_empty_first_page=allow_empty_first_page, **kwargs)
Internal Server Error: /operator-autocomplete/
Traceback (most recent call last):
  File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response        
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response        
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\dal\views.py", line 50, in dispatch
    return super(ViewMixin, self).dispatch(request, *args, **kwargs)
  File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\views\generic\list.py", line 158, in get
    return self.render_to_response(context)
  File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\dal_select2\views.py", line 61, in render_to_response
    'results': self.get_results(context) + create_option,
  File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\dal_select2\views.py", line 26, in get_results
    } for result in context['object_list']
  File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\dal_select2\views.py", line 26, in <listcomp>
    } for result in context['object_list']
  File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\lib\site-packages\dal\views.py", line 81, in get_result_value
    return str(result.pk)
AttributeError: 'dict' object has no attribute 'pk'

1 Ответ

1 голос
/ 28 января 2020

если вы хотите автозаполнение для определенного поля, вместо charfield сделайте это поле чужим и внедрите автозаполнение. Например, если у вас есть поле с именем dog в классе Animal, создайте класс Dog и в формах вы можете сделать это следующим образом

class AnimalCreateForm(forms.ModelForm):
    dog = forms.ModelChoiceField(
        queryset=Dog.objects.all(),
        widget=autocomplete.ModelSelect2(url='dog_auto')
    )
    class Meta:
        model = Animal
        fields = [
        'dog', ----,
    ]
...