2010-01-20 12 views
10

Tengo un formset en línea y me gustaría excluir algunos objetos de modelo para que no se muestren en el formset.administrador de Django, objetos de filtro para formset en línea

Por ej. hay un modelo B que tiene una clave foránea para el modelo A, por lo que es una relación 1: n (Un objeto tiene muchos objetos B). Ahora, en una página de edición de administrador, tengo líneas de B. Me pregunto si es posible filtrar la lista de objetos B antes de que se represente el formset en línea, de modo que no todos los objetos B relacionados con A entran en el formset.

Respuesta

18

En respuesta a propia pregunta puede parecer un poco extraño, pero he encontrado otra solución;)

Hubo un problema para proporcionar queryset personalizada a un juego de formularios, no hay gancho en el caso de juegos de formularios en línea para esto. Así que subclasé BaseInlineFormSet y anulé el método get_queryset. Luego solo proporciono este formset en InlineModelAdmin y listo.

Ejemplo:

class MyFormSet(BaseInlineFormSet): 
    def get_queryset(self): 
     if not hasattr(self, '_queryset'): 
      qs = super(MyFormSet, self).get_queryset().filter(main=False) 
      self._queryset = qs 
     return self._queryset 

y admin clase:

class MyInline(admin.TabularInline): 
    model = m.MyModel 
    formset = MyFormSet 
    ... 
+0

Excelente - esto es justo lo que estaba buscando. El uso de la propiedad privada '_queryset' impide que la consulta SQL se active decenas de veces por página. Muy agradable. – richbs

0

Puede escribir su propio administrador a su modelo (especial para formset) y usarlo.

http://docs.djangoproject.com/en/dev/topics/db/managers/

+0

muchas gracias. Parece una buena solución, aunque tendré que usar algún otro administrador (no predeterminado) en todos los demás lugares porque necesito esos objetos filtrados en todas partes, simplemente no en la página de administración. Es una lástima que no haya una opción de administrador para proporcionar un administrador personalizado, no predeterminado para las líneas. –

+1

Bueno, encontré que uno puede proporcionar el conjunto/administrador de consultas no predeterminado para las líneas en línea al crear una subclase de BaseInlineFormSet (http://docs.djangoproject.com/en/1.1/topics/forms/modelforms/#model-formsets) y luego proporcionar este formset a InlineModelAdmin por la propiedad 'formset'. ¡Bonito! –

+0

Si escribe su propio administrador, es posible que deba realizar más soluciones si su modelo también está registrado con Django Admin. – OverClocked

Cuestiones relacionadas