tipos - Conjunto de formularios en línea en Django-eliminando ciertos campos
post django (3)
Acabo de tener un problema similar (no para el administrador, para el sitio orientado al usuario) y descubrí que puede pasar el formset y los campos que desea que se muestren en inlineformset_factory
como este:
factory = inlineformset_factory(UserProfile, PointTransaction,
formset=PointTransactionFormset,
fields=(''description'',''points_type''))
formset = factory(instance=user_profile, data=request.POST)
donde user_profile
es un user_profile
.
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 pasados a inlineformset_factory
, pero ese es el caso para cualquier tipo de formulario.
Necesito crear un formset en línea que
a) excluye algunos campos de MyModel
se muestran en conjunto
b) muestra algunos campos MyModel
pero impide que sean editables.
Intenté usar el código a continuación, usando values()
para filtrar el conjunto de consultas a solo aquellos valores que quería devolver. Sin embargo, esto falló.
¿Alguien con 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
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. Entonces, por ejemplo, supongamos que tiene una forma de modelo de persona, puede usarla en un formset modelo haciendo esto
PersonFormSet = inlineformset_factory(User, Person, form=PersonForm, extra=6)
Esto le permite hacer toda la validación, exclusión, etc. del formulario en un nivel de modelo y hacer que la fábrica lo replique.
¿Es esto un formset para usar en el administrador? Si es así, simplemente configure " exclude = [''field1'', ''field2'']" 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 el atributo en la clase Meta interna, reemplazar el widget en el método __init__) en una subclase ModelForm que pase al constructor formset. (Si está utilizando Django 1.2 o posterior, puede usar readonly_fields en su lugar).
Puedo actualizar con ejemplos de código si aclaras en qué situación te encuentras (administrador o no).