python - django-autocomplete key error -
i installed via pip install django-autocomplete
, django autocomplete's documentation said.
then, added code, following documentation given.
i error: keyerror: gestion.clientes
and also, when try import views module gestion app, says attributeerror: 'module' object has no attribute 'autocomplete'
it seems cannot import gestion/views.py, since there's circular import going on... tried attack issue in many ways, i'm stucked...
here's app files
the app called "gestion", i'm running django 1.3 in virtualenv python2.7
gestion/views.py
# -*- encoding: utf-8 -*- django.core.paginator import paginator, pagenotaninteger, emptypage, invalidpage django.shortcuts import render_to_response,render django.contrib import messages django.http import httpresponseredirect, httpresponse django.core.urlresolvers import reverse django.core import serializers import models django.db.models import q django.utils import simplejson autocomplete.views import autocompleteview import forms autocomplete = autocompleteview('gestion') def home(request): return render(request,'index.html') def facturas(request, cliente=0): return render(request,'facturas.html') def cliente_nuevo(request): form = forms.clientes() if request.method == 'post': form = forms.clientes(request.post) cliente = form.save() messages.add_message(request,messages.success,'el cliente ha sido creado correctamente') return httpresponseredirect(reverse('cliente_detalle',args=(cliente.pk,))) return render(request,'cliente-nuevo.html',{'form':form}) def clientes(request): #si la petición es de tipo post, devuelve un listado de cientes en json if request.method == 'post': if 'q' in request.post: query_build = q(**{"razon_social__icontains": request.post['s'] }) clientes = models.cliente.objects.filter(query_build) else: clientes = models.cliente.objects.all() data = serializers.serialize('json', clientes) return httpresponse(data, mimetype='application/json') params = request.get.copy() s = none if 'page' in params: del(params['page']) if 's' in params: query_build = q(**{"razon_social__icontains": params['s'] }) clientes = models.cliente.objects.filter(query_build) s = params['s'] else: clientes = models.cliente.objects.all() paginator = paginator(clientes, 20)#clientes por página try: page = int(request.get.get('page', '1')) except valueerror: page = 1 clientes = paginator.page(page) path = params.urlencode() return render(request,'clientes.html',{'clientes':clientes,'path':path,'s':s}) def cliente_detalle(request, id): cliente = models.cliente.objects.get(pk = id) return render(request,'cliente-detalle.html',{'cliente':cliente}) def cliente_editar(request, id): cliente = models.cliente.objects.get(pk = id) form = forms.clientes(instance=cliente) return render(request,'cliente-editar.html',{'form':form, 'cliente':cliente}) def articulo_nuevo(request): form = forms.articulo() if request.method == 'post': form = forms.articulo(request.post) if form.is_valid(): form.save() messages.add_message(request,messages.success,'el artículo ha sido creado correctamente') return httpresponseredirect(reverse('articulos')) return render(request,'articulo-nuevo.html',{'form':form}) def articulos(request): params = request.get.copy() s = none c = none if 'page' in params: del(params['page']) q = q() if 's' in params , params['s']: q.add(q(**{"nombre__icontains": params['s']}), q.and) q.add(q(**{"referencia__icontains": params['s']}), q.or) s = params['s'] if 'c' in params , params['c']: c = params['c'] q.add(q(**{"categoria__contains":c}), q.and) articulos = models.articulo.objects.filter(q) sql = articulos.query articulos = list(articulos.order_by('stock')) paginator = paginator(articulos, 2)#artículos por página try: page = int(request.get.get('page', '1')) except valueerror: page = 1 articulos = paginator.page(page) path = params.urlencode() return render(request,'articulos.html',{'lista':list(articulos.object_list),'articulos':articulos, 'path':path, 's':s, 'c':c, 'categorias': models.articulo.categorias, 'sql':sql}) def factura_nueva(request): return render(request,'factura-nueva.html') def pedidos(request): return render(request,'pedidos.html') def nueva_linea_de_pedido(request): form = forms.linea() return render(request,'pedido-linea-nueva.html',{'form':form}) def editar_linea_de_pedido(request, linea): return render(request,'pedido-linea-editar.html')
gestion/forms.py
# -*- encoding: utf-8 -*- django import forms import gestion.models models import views import autocomplete.utils utils import autocomplete.widgets widgets class clientes(forms.modelform): razon_social = forms.charfield(widget=forms.textinput(attrs={'required':''}),error_messages={'required': 'escriba la razón social'}) numero_de_cliente = forms.charfield(widget=forms.textinput(attrs={'required':''}),required=true,error_messages={'required': 'escriba el número de cliente'}) cuit = forms.charfield(widget=forms.textinput(attrs={'required':''}),error_messages={'required':'escriba el número de cuit/cuil'}) direccion = forms.charfield(widget=forms.textinput(attrs={'required':''}),error_messages={'required':'escriba la dirección'}) condicion_de_iva = forms.choicefield(choices=models.cliente.condiciones_de_iva,error_messages={'required':'seleccione una condición de iva'}) contacto = forms.charfield(required=false) class meta: model = models.cliente class articulo(forms.modelform): nombre = forms.charfield(widget=forms.textinput(attrs={'required':'','placeholder':'nombre','class':'span4'})) costo = forms.floatfield(widget=forms.textinput(attrs={'required':'','placeholder':'costo','class':'span4'}),error_messages={'invalid':'el costo debe ser numérico'}) categoria = forms.charfield(widget=forms.select(attrs={'class':'span4'}, choices=models.articulo.categorias)) referencia = forms.charfield(widget=forms.textinput(attrs={'required':'','placeholder':'referencia','class':'span4'})) stock = forms.integerfield(widget=forms.textinput(attrs={'required':'','placeholder':'stock','class':'span4'}),error_messages={'invalid':'el stock debe ser un número entero'}) class meta: model = models.articulo class linea(forms.modelform): articulo_txt = forms.charfield(widget=forms.textinput(attrs={'placeholder':'comienze escribir','class':'span4'})) articulo = forms.integerfield(widget=forms.hiddeninput()) cliente = utils.autocomplete_formfield('gestion.clientes',widget=widgets.autocompletewidget('gestion.clientes', view=views.autocomplete)) class meta: model= models.linea
gestion/urls.py
from django.conf.urls.defaults import patterns, include, url gestion import views django.conf import settings import gestion.autocomplete_settings urlpatterns = patterns('', # examples: # url(r'^$', 'imprenta.views.home', name='home'), # url(r'^imprenta/', include('imprenta.foo.urls')), # uncomment admin/doc line below enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # uncomment next line enable admin: # url(r'^admin/', include(admin.site.urls)), url(r'^$', views.home, name='home'), url(r'^facturas/$', views.facturas, name='facturas'), url(r'^facturar/$', views.factura_nueva, name='facturar'), url(r'^clientes/nuevo/$', views.cliente_nuevo, name='cliente-nuevo'), url(r'^clientes/$', views.clientes, name='clientes'), url(r'^clientes/detalle/([0-9]+)$', views.cliente_detalle, name='cliente_detalle'), url(r'^cliente/([0-9]+)/facturas/$', views.facturas, name='cliente_facturas'), url(r'^clientes/editar/([0-9]+)$', views.cliente_editar, name='cliente_editar'), url(r'^articulos/$', views.articulos, name='articulos'), url(r'^articulos/nuevo/$', views.articulo_nuevo, name='articulo_nuevo'), url(r'^pedidos/$', views.pedidos, name='pedidos'), url(r'^pedidos/lineas/nueva/$', views.nueva_linea_de_pedido, name='pedidos-linea-nueva'), url(r'^pedidos/lineas/editar/([0-9]+)$', views.editar_linea_de_pedido, name='pedidos-linea-editar'), url(r'^autocomplete/', include(views.autocomplete.urls)), ) + patterns('', (r'^media/(?p<path>.*)$', 'django.views.static.serve', { 'document_root': settings.media_root}))
you should never import views
forms
. forms used in views, not vice versa. i'd move autocomplete = autocompleteview('gestion')
separate module (for example, gestion.autocomplete
) , imported there.
p.s. please note modules in python named in lowercase, should gestion
, not gestion
Comments
Post a Comment