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__
.
Completando la answer de @ John de arriba, define lo que te gustaría ver en tu lista de cambios:
return ''<a href="%s">%s</a>'' % (
reverse(''admin:applabel_customer_change'', (self.customer.id,)),
self.customer.name # add more stuff here
)
Y para agregar esto al formulario de cambio, vea: Agregue HTML personalizado entre dos campos de modelo en el formulario de cambio de administrador de Django
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.