ошибка django-autocomplete-light = объект «список» не имеет атрибута «queryset»

я новичок в django, и мне нужна ваша помощь, я много дней пытаюсь понять django-autocomplete-light, после настройки моего теста, http://192.168.0.108:8000/country-autocomplete/ работает, данные отображаются так, как описано здесь http://django-autocomplete-light.readthedocs.io/en/master/tutorial.html#overview

Но после следующего шага я получаю сообщение об ошибке:

AttributeError at /auto
'list' object has no attribute 'queryset'
Request Method: GET
Request URL:    http://192.168.0.108:8000/auto
Django Version: 1.10.3
Exception Type: AttributeError
Exception Value:'list' object has no attribute 'queryset'
Exception Location: /home/alcall/ENV/lib/python3.4/site-packages/dal/widgets.py in filter_choices_to_render, line 161

Ниже моей настройки:

URL:

from dal import autocomplete
from django.conf.urls import url
from django.contrib import admin
from rates.view.index import *
from rates.view.index import UpdateView

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(
    r'^country-autocomplete/$',
    CountryAutocomplete.as_view(),
    name='country-autocomplete',
),
url(r'^auto$',
    UpdateView.as_view(),
    name='select',
),
]

модели.py

from __future__ import unicode_literals
from django.db import models

class Country(models.Model):
    enabled = models.IntegerField()
    code3l = models.CharField(unique=True, max_length=3)
    code2l = models.CharField(unique=True, max_length=2)
    name = models.CharField(unique=True, max_length=64)
    name_official = models.CharField(max_length=128, blank=True, null=True)
    prix = models.FloatField()
    flag_32 = models.CharField(max_length=255, blank=True, null=True)
    flag_128 = models.CharField(max_length=255, blank=True, null=True)
    latitude = models.DecimalField(max_digits=10, decimal_places=8,     blank=True,$
    longitude = models.DecimalField(max_digits=11, decimal_places=8, blank=True$
    zoom = models.IntegerField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'country'

    def __str__(self):
        return self.name

вид (включая форму)

from dal import autocomplete
from django.shortcuts import render
from rates.models import Country
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.http import HttpResponse
from django import forms
from django.core.urlresolvers import reverse_lazy
from django.views import generic

class CountryAutocomplete(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 Country.objects.none()

        qs = Country.objects.all()

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

        return qs

class Form_country(forms.ModelForm):
    class Meta:
       model = Country
       fields = ('name', 'code2l')
       widgets = {
          'name': autocomplete.ModelSelect2Multiple(
            'country-autocomplete'
           )
       }

class UpdateView(generic.UpdateView):
    model = Country
    form_class = Form_country
    template_name = 'fr/public/monformulaire.html'
    success_url = reverse_lazy('select')


    def get_object(self):
        return Country.objects.first() 

person Kef    schedule 26.11.2016    source источник
comment
Проверьте код, которым вы поделились. Это не выглядит правильно. - Например, шаблон url нацелен на autos , но ваш url — это всего лишь auto.   -  person karthikr    schedule 26.11.2016
comment
я меняю его с r'^autos?$ на r'^auto$', все та же проблема   -  person Kef    schedule 26.11.2016
comment
Выложите полную трассировку, пожалуйста   -  person jpic    schedule 10.01.2017


Ответы (3)


Я была такая же проблема. Проблема здесь с виджетом. Очень долго пытался исправить. Единственный способ, которым я работал, - это изменение виджета формы.

Если это не имеет большого значения, вы можете вместо этого использовать autocomplete.ListSelect2, это сработало для меня.

Итак, попробуйте следующее:

class Form_country(forms.ModelForm):
    class Meta:
       model = Country
       fields = ('name', 'code2l')
       widgets = {
          'name': autocomplete.ListSelect2(
            'country-autocomplete'
           )
       }

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

person pythad    schedule 26.11.2016

Если вы создаете виджет в __init__(), тогда этот обходной путь выпуск № 790 помогает:

form.fields['name'].widget.choices = form.fields['name'].choices
person guettli    schedule 06.03.2017

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

ВАЖНО: После того, как вы сделали все это, не забудьте запустить python manage.py collectstatic. Также обратите внимание, что вы хотите включить placeholder в поле формы, вы должны сделать это с data-placeholder в виджете autocomplete .

Когда вы запустите его, вы увидите это сообщение

Найден другой файл с целевым путем «admin/js/jquery.init.js». Он будет проигнорирован, так как собирается только первый встреченный файл. Если это не то, что вам нужно, убедитесь, что каждый статический файл имеет уникальный путь.

По этой причине в документации указано здесь, что вы необходимо поместить dal и dal_select2 перед django.contrib.admin в вашем INSTALLED_APPS

models.py

from django.db import models

class Patient(models.Model):
    name = models.CharField(max_length=100)
    stable = models.BooleanField(default=False)

views.py

from django.db.models import Q
from dal import autocomplete

class NewName(autocomplete.Select2QuerySetView):
    """Suggest similar names in form"""
    def get_queryset(self):
        qs = People.objects.filter(stable=True)
        if self.q:
            query = Q(name__contains=self.q.title()) | Q(name__contains=self.q.lower()) | Q(name__contains=self.q.upper())
            qs = qs.filter(query)
        return qs

urls.py

from django.urls import path
from . import views
urlpatterns = [
    path('new-name/', views.NewName.as_view(), name='new_name_autocomplete'),
]

forms.py

class PatientForm(forms.ModelForm):
    class Meta:
        model = Patient
        fields = ["stable", "name"]

        widgets = {
            "name" : autocomplete.ModelSelect2(url=reverse_lazy('new_name_autocomplete'), attrs={'class' : 'form-control', 'data-placeholder' : "Name"}),

Мне пришлось изменить dal/widgets.py и закомментировать фильтрацию набора запросов, как показано ниже. Кажется, это ошибка или что-то в этом роде. Проблема была поднята здесь. Но если вы используете autocomplete.ListSelect2() в качестве виджета, то в этом нет необходимости.

class QuerySetSelectMixin(WidgetMixin):
    """QuerySet support for choices."""

    def filter_choices_to_render(self, selected_choices):
        """Filter out un-selected choices if choices is a QuerySet."""
        # self.choices.queryset = self.choices.queryset.filter(
        #     pk__in=[c for c in selected_choices if c]
        # )
person chidimo    schedule 05.06.2018