2011-12-17 14 views
20

Soy nuevo en Django y trato de pasar el nombre de un autor a una vista y filtrar objetos de citas basados ​​en el nombre del autor. aquí están los códigos:Django: literal no válido para int() con base 10

models.py

class Author(models.Model): 
    author_name = models.CharField(max_length=50, default='unknown') 
    author_info = models.TextField(max_length=1000) 


class Quote(models.Model): 
    author = models.ForeignKey(Author) 
    quote = models.TextField(max_length=500) 
    category= models.ForeignKey(Category) 
    pub_date = models.DateTimeField('date published') 

urls.py:

url(r'^quotes/(?P<name>\w+)/$', 'quotes.views.quotesbyauthor'), 

views.py

def quotesbyauthor(request, name): 
    aquotelist = Quote.objects.filter(author__exact = name) 
    return render_to_response(quotes_by_author.html, {'aquotelist': aquotelist }) 

Sin embargo, me sale este error cuando intento de conseguir http://127.0.0.1:8000/quotes/you/ ('usted' es un objeto de autor de prueba, ya creado)

ValueError at /quotes/you/ 

invalid literal for int() with base 10: 'you' 

Request Method:  GET 
Request URL: http://127.0.0.1:8000/quotes/you/ 
Django Version:  1.3.1 
Exception Type:  ValueError 
Exception Value:  

invalid literal for int() with base 10: 'you' 

Exception Location:  /home/qliq/djenv/lib/python2.6/site-packages/django/db/models/fields/__init__.py in get_prep_value, line 479 
Python Executable: /home/qliq/djenv/bin/python 
Python Version:  2.6.6 
Python Path:  

['/home/qliq/djenv/quoteapp', 
'/home/qliq/djenv/lib/python2.6/site-packages/distribute-0.6.10-py2.6.egg', 
'/home/qliq/djenv/lib/python2.6/site-packages/pip-0.7.2-py2.6.egg', 
'/home/qliq/djenv/lib/python2.6', 
'/home/qliq/djenv/lib/python2.6/plat-linux2', 
'/home/qliq/djenv/lib/python2.6/lib-tk', 
'/home/qliq/djenv/lib/python2.6/lib-old', 
'/home/qliq/djenv/lib/python2.6/lib-dynload', 
'/usr/lib/python2.6', 
'/usr/lib/python2.6/plat-linux2', 
'/usr/lib/python2.6/lib-tk', 
'/home/qliq/djenv/lib/python2.6/site-packages'] 

Agradezco su ayuda para resolver esto.

+0

¿Es solo un error de pegar que su plantilla .html no tiene citas al respecto? – jdi

+0

También publique un traceback más completo, ya que debería indicarle una línea específica y el contexto del error. Intente configurar el nombre a una palabra clave predeterminada como quotesbyauthor (request, name = '') – jdi

+0

@jdi, actualicé la pregunta con un mensaje de error más detallado. Además, agregué comillas alrededor del nombre de la plantilla, pero no tuvo efecto. – qliq

Respuesta

27

Quiere buscar en el campo author_name del autor, no en el id.

Quote.objects.filter(author__author_name=name) 

con su criterio de búsqueda, author__exact, Django espera name a ser el ID del autor, por lo que da un error porque you no es un entero.

+0

gah Descuidé totalmente ese cuando estaba comentando arriba. Buen ojo :-) – jdi

+0

Según la respuesta de U-DON, él realmente nombra su atributo author_name para que el filtro necesite una solución – jdi

+0

@jdl sí, tenía un nombre de campo incorrecto. Lo he arreglado ahora. – Alasdair

4
aquotelist = Quote.objects.filter(author__author_name__exact = name) 

Intente cambiar la línea correspondiente a la de arriba. De la forma en que lo tienes ahora, estás haciendo coincidir author con el nombre de pila, pero author probablemente sea considerado por su ID aquí, definitivamente no por su author_name. El formato es el siguiente:

Quote.objects.filter([model]__[field]__exact = [whatever]) 
+0

Gracias, recordaría la sintaxis del filtro para evitar errores similares. – qliq

Cuestiones relacionadas