2010-06-15 13 views
5

Acabo de empezar a jugar con Django hoy y hasta ahora me resulta bastante difícil hacer cosas simples. Lo que estoy luchando ahora es filtrar una lista de tipos de estado. El modelo es StatusTypes:Filtrando los resultados del modelo para el cuadro de selección de administración de Django

class StatusTypes(models.Model): 
    status = models.CharField(max_length=50) 
    type = models.IntegerField() 
    def __unicode__(self): 
     return self.status 
    class Meta: 
     db_table = u'status_types' 

En una página de administración que necesito todos los resultados, donde type = 0 y en otro Voy a necesitar todos los resultados, donde type = 1 por lo que puede limitar no sólo desde dentro de la modelo. ¿Cómo voy a hacer esto?

EDIT: Debería haber sido un poco más claro. Tengo un modelo de "Unidad" que tiene una clave externa para StatusTypes. Los modelos son los siguientes:

class StatusTypes(models.Model): 
    status = models.CharField(max_length=50) 
    type = models.IntegerField() 
    def __unicode__(self): 
     return self.status 
    class Meta: 
     db_table = u'status_types' 

class Unit(models.Model): 
    name = models.CharField(unique=True, max_length=50) 
    status = models.ForeignKey(StatusTypes, db_column='status') 
    note = models.TextField() 
    date_added = models.DateTimeField() 
    def __unicode__(self): 
     return self.name 
    class Meta: 
     db_table = u'units' 

Así que ahora en la página de administración para el modelo de la unidad Quiero limitar el estado de sólo aquellos con type = 1. Sobre la base de la respuesta fuera lazerscience continuación probé el siguiente código:

from inv.inventory.models import Unit 
from django.contrib import admin 

class UnitAdmin(admin.ModelAdmin): 
    def queryset(self, request): 
     qs = super(UnitAdmin, self).queryset(request) 
     return qs.filter(type=0) 

admin.site.register(Unit, UnitAdmin) 

Pero, no cambió la casilla de selección en absoluto. También traté de imprimir el valor de qs y no se envió nada a mi terminal, así que me pregunto si tengo alguna forma de invocar queryset.

EDIT 2: Es posible que no esté claro que quiero filtrar esto para el menú desplegable de estado que está en la página de creación para el modelo de la Unidad.

Respuesta

3

EDIT:

Resulta que ModelAdmin.formfield_for_foreignkey era la respuesta correcta en esta situación: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

respuesta anterior:

Tome un vistazo a la list_filter attribute of ModelAdmin. Eso suena más a lo que me quieres, ya que creará una interfaz agradable para filtrar en diferentes criterios en lugar de restringir arbitrariamente tu queryset.

+0

Gracias por la respuesta.List_filter no funcionará porque no puede tener una unidad con un estado de tipo = 0 y, a menos que esté equivocado, list_filter simplemente agrega una barra lateral que le da al usuario la opción. Estoy un poco sorprendido de que esto sea tan difícil de hacer ... al menos aún no he podido encontrar una respuesta. Todo lo que quiero hacer es agregar 'DONDE parte = 1' a la consulta. – blcArmadillo

+0

Tal vez estoy perdiendo el sentido de lo que quiere, pero si agrega 'status' a la lista' list_filter', le dará un widget que le permite filtrar en función de los valores permitidos para ese campo. Funciona al agregar un parámetro get a la URL del administrador, exactamente como lo que necesita. –

+0

Gabriel, me acabo de dar cuenta de lo que podría ser la confusión. Quiero filtrar los tipos de estado para el campo de selección de estado en la página agregar. No agregue una columna de filtro a la lista de Unidades que ya se han agregado. ¿Esto ayuda a aclarar las cosas? – blcArmadillo

2

Puede reemplazar el método queryset de la clase MyModelAdmin:

from django.contrib import admin 

class MyModelAdmin(admin.ModelAdmin): 

    def queryset(self, request): 
     qs = super(MyModelAdmin, self).queryset(request) 
     return qs.filter(type=0) 

admin.site.register(StatusTypes, MyModelAdmin) 

Este administrador sólo va a mostrar los objetos de su modelo que tienen type=0!

+0

Gracias por la ayuda. Después de su respuesta, me di cuenta de cómo debería haber dado más información en la pregunta, ya que lo que estaba preguntando no era exactamente lo que tenía que hacer. Intenté modificar tu código para adaptarme a mis necesidades, así como buscar algunos recursos para reemplazar el queryset. Intenté imprimir el valor de qs, pero no obtuve nada en mi terminal. ¿Tengo que llamar de alguna manera queryset? – blcArmadillo

+0

Debería entonces filtrar su queryset así: 'qs.filter (status__type = 0)'. Al final estás hablando de un menú desplegable, ¿qué quieres decir con eso? Y sí, siempre que tenga algo guardado, debería ver algo en su conjunto de consulta. Pruebe 'python manage.py shell',' from myapp.models import Unit', 'Unit.objects.filter (status__type = 0)'; ¡juega un poco con eso! –

+0

Gracias por la ayuda. Voy a investigar eso. – blcArmadillo

Cuestiones relacionadas