2009-02-18 14 views
10

Necesito crear un formset inline queInline formset en Django - la eliminación de ciertos campos

a) excluye algunos campos de MyModel que se muestra por completo

b) muestra algunos algunos campos MyModel pero les impide ser editable .

He intentado usar el siguiente código, usando values() para filtrar el conjunto de consultas a solo aquellos valores que quería devolver. Sin embargo, esto falló.

¿Alguien tiene alguna idea?

class PointTransactionFormset(BaseInlineFormSet): 
    def get_queryset(self): 
     qs = super(PointTransactionFormset, self).get_queryset() 
     qs = qs.filter(description="promotion feedback") 
     qs = qs.values('description','points_type') # this does not work 
     return qs 

class PointTransactionInline(admin.TabularInline): 
    model = PointTransaction 
    #formset = points_formset() 
    #formset = inlineformset_factory(UserProfile,PointTransaction) 
    formset = PointTransactionFormset 

Respuesta

6

¿Es esto un formset para usar en el administrador? Si es así, simplemente configure "exclude = ['campo1', 'campo2']" en su InlineModelAdmin para excluir los campos. Para mostrar algunos valores de campos no editables, tendrá que crear un widget personalizado simple cuyo método render() simplemente devuelve el valor, y luego anular el método formfield_for_dbfield() para asignar su widget a los campos adecuados.

Si esto no es para el administrador, sino un formset para usar en otro lugar, debe realizar las personalizaciones anteriores (excluir atributo en la clase Meta, anulación de widget en el método __init__) en una subclase ModelForm que pasa al formset constructor. (Si está utilizando Django 1.2 o posterior, puede simplemente usar readonly_fields en su lugar).

Puedo actualizar con ejemplos de código si clarifica en qué situación se encuentra (admin o no).

2

que acaba de tener un problema similar (no por admin - del sitio web de usuario orientada) y descubrió que puede pasar el juego de formularios y los campos que desea mostrar en inlineformset_factory así:

factory = inlineformset_factory(UserProfile, PointTransaction, 
       formset=PointTransactionFormset, 
       fields=('description','points_type')) 
formset = factory(instance=user_profile, data=request.POST) 

donde user_profile es una UserProfile.

Tenga en cuenta que esto puede causar problemas de validación si el modelo subyacente ha requerido campos que no están incluidos en la lista de campos pasada a inlineformset_factory, pero ese es el caso para cualquier tipo de formulario.

12

Una cosa que no parece decirse en la documentación es que puede incluir un formulario dentro de sus parámetros para los conjuntos de formularios del modelo. Así, por ejemplo, digamos que usted tiene un ModelForm persona, que se puede utilizar en un modelo formset al hacer esto

PersonFormSet = inlineformset_factory(User, Person, form=PersonForm, extra=6) 

Esto le permite hacer toda la validación de formularios, excluye, etc en un nivel ModelForm y tienen la fábrica lo replica.

Cuestiones relacionadas