template original manage jinja get_template does accept python django django-admin foreign-keys

python - original - load django template



Solución similar a la línea para Django Admin donde Admin contiene ForeignKey a otro modelo (3)

Tengo varios Customer que reservan Appointment . Cada Appointment tiene exactamente un cliente, aunque un cliente puede ser reservado para citas múltiples que ocurren en diferentes momentos.

class Customer(model.Model): def __unicode__(self): return u''%s'' % (self.name,) name = models.CharField(max_length=30) # and about ten other fields I''d like to see from the admin view. class Appointment(models.Model): datetime = models.DateTimeField() customer = models.ForeignKey("Customer") class Meta: ordering = (''datetime'',)

Ahora, cuando un administrador va a navegar a través del calendario mirando las Citas (ordenadas por tiempo) en el administrador, a veces quieren ver información sobre el cliente que tiene una cita determinada. En este momento, tendrían que recordar el nombre del cliente, navegar desde la Cita a la página de administración del Cliente, encontrar al Cliente recordado y solo entonces podrían buscar su información.

Idealmente, algo como un administrador en línea sería genial. Sin embargo, parece que solo puedo hacer un CustomerInline en la página de administración de Appointment si el Customer tiene un ForeignKey("Appointment") . (Django específicamente me da un error que dice que el Customer no tiene ForeignKey para la Appointment ). ¿Alguien sabe de una funcionalidad similar, pero cuando la Appointment tiene un ForeignKey(''Customer'') ?

Nota: simplifiqué los modelos; el campo del Cliente real actualmente tiene alrededor de 10 campos además del nombre (texto libre), por lo que no sería práctico colocar toda la información en el __unicode__ .



En la clase ModelAdmin para sus citas, debe declarar el siguiente método:

class MySuperModelAdmin(admin.ModelAdmin): def get_form(self, request, obj=None, **kwargs): if obj: # create your own model admin instance here, because you will have the Customer''s # id so you know which instance to fetch # something like the following inline_instance = MyModelAdminInline(self.model, self.admin_site) self.inline_instances = [inline_instance] return super(MySuperModelAdmin, self).get_form(request, obj, **kwargs)

Para obtener más información, busque la fuente de esa función para darle una idea de a qué tendrá acceso.

https://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py#L423


No hay una manera fácil de hacer esto con django. Los inlines están diseñados para seguir las relaciones hacia atrás.

Potencialmente, el mejor sustituto sería proporcionar un enlace al objeto de usuario. En la vista de lista esto es bastante trivial:

Agregue un método a su modelo de cita como:

def customer_admin_link(self): return ''<a href="%s">Customer</a>'' % reverse(''admin:app_label_customer_change %s'') % self.id customer_admin_link.allow_tags = True customer_admin_link.short_description = ''Customer''

Luego en su ModelAdmin agregue:

list_display = (..., ''customer_admin_link'', ...)

Otra solución para obtener exactamente lo que está buscando al costo de ser un poco más complejo sería definir una plantilla de administración personalizada. Si haces eso básicamente puedes hacer cualquier cosa. Aquí hay una guía que he usado antes para explicar: http://www.unessa.net/en/hoyci/2006/12/custom-admin-templates/

Básicamente, copie la forma de cambio de la fuente de django y agregue un código para mostrar la información del cliente.