Tengo dos modelos, un modelo principal y un modelo en línea relacionado que me gustaría mostrar como un en línea en el administrador. Este modelo en línea se puede utilizar para, por ejemplo, tomar notas sobre el modelo y debe hacer un seguimiento del usuario administrador que realiza cambios. Si bien esto parece simple (y, de hecho, los documentos muestran un ejemplo de esto cuando el campo de usuario es parte del MainModel), parece que no puedo entenderlo cuando el campo está en línea.Django InlineModelAdmin - establecer el campo en línea desde la solicitud al guardar (establecer el campo de usuario automáticamente) (save_formset vs save_model)
Para ser más específicos, mi objetivo es:
- usuario edita MainModel
- usuario añade un InlineModel, no llenar en el campo de usuario
- usuario presiona ahorrar
- Código rellena el campo de usuario para las instancias de InlineModel recién creadas
- (el campo de usuario de Bonus! es solo para instancias existentes y está oculto para las nuevas líneas)
Y mis preguntas:
- ¿Es esto correcto? Su demasiado bajo save_model no se llama para las instancias de InlineModelAdmin
- ¿Hacerlo de esta manera me permite guardar sin causar un error? (se requiere usuario, la validación lo señala)
- ¿Cómo puedo ocultar el campo de entrada del usuario para las nuevas líneas y que sea de solo lectura para las líneas en línea existentes?
Estas son mis ideas actuales:
#models.py
class MainModel(models.Model):
some_info = models.IntegerField()
class InlineModel(models.Model):
main = models.ForeignKey(MainModel)
data = models.CharField(max_length=255)
user = models.ForeignKey('auth.User')
#admin.py
class InlineModelInline(admin.TabularInline):
model = InlineModel
fields = ('data', 'user')
#readonly_fields = ('data', 'user') #Bonus question later
class MainModelAdmin(admin.ModelAdmin):
list_display = ('id', 'some_info')
inlines = [InlineModelInline]
#def save_model(self, request, obj, form, change):
#http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model
#Only called for MainModel, not for any of the inlines
#Otherwise, would be ideal
def save_formset(self, request, form, formset, change):
#http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_formset
#Experimenting showd this is called once per formset (where the formset is a group of inlines)
#See code block at http://code.djangoproject.com/browser/django/tags/releases/1.2.1/django/contrib/admin/options.py#L894
if not isinstance(formset.model, InlineModel):
return super(MainModelAdmin, self).save_formset(request, form, formset, change)
instances = formset.save(commit=False)
for instance in instances:
if not instance.pk:
instance.user = request.user
instance.save()
formset.save_m2m()
Una nota a mí mismo, este save_formset es un método de la admin.ModelAdmin, y procesará todos los niños inlines asignado en el ModelAdmin – monkut
Gracias por su pregunta/respuestas aquí. En cuanto a la funcionalidad de 'bonificación': después de marcar el usuario foreignKey en el modelo django con editable = False, el formset en línea pasó la validación, el campo de usuario todavía estaba establecido y todo era kosher. user = models.ForeignKey (Usuario, editable = Falso) – sdailey
Hm, se olvidó por completo de editable = Falso en el modelo. Nice ca tch, gracias. –