2016-11-26 3 views
2

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

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

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 

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

URLs:

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', 
), 
] 

models.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() 
+1

Проверьте, пожалуйста, код, которым вы пользовались. Это выглядит не так. Например, шаблон 'url' задает' autos', но ваш 'url' - это просто' auto' – karthikr

+0

Я меняю его с r '^ autos? $ На r'^auto $ ', все тот же выпуск – Kef

+0

Опубликовать полный след назад – jpic

ответ

2

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

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

Так попробуйте это:

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

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

0

Я создать виджет в __init__(), то эта работа, вокруг issue #790 помогает:

form.fields['name'].widget.choices = form.fields['name'].choices 
Смежные вопросы