2010-02-27 74 views
7

Este tema es bastante común (se detalla más explícitamente aquí: http://www.hoboes.com/Mimsy/hacks/replicating-djangos-admin/), pero sigo teniendo problemas con él. Estoy intentando usar la funcionalidad del botón "más" que se usa en el sitio de administración, donde se puede agregar una clave externa adicional a una entrada vinculada. En el sitio de administración, se abre una ventana emergente que permite al usuario enviar un nuevo campo y luego ese nuevo valor se rellena en el formulario original.Funcionalidad emergente Django Admin

Creo que mi problema se centra en torno a la inclusión de esta línea:

dentro de la plantilla y la plantilla base.html popadd.html. Al hacer clic en el botón más no aparece una nueva ventana. La plantilla popadd simplemente carga en la misma pestaña. Y al enviar una nueva entrada, el usuario no vuelve al formulario original.

El sitio de administración es funcional. Incluyo ADMIN_MEDIA_PREFIX = '/ media/admin /' en el archivo settings.py. ¿Tiene algo que ver con el lugar donde vive RelatedObjectLookups.js? Actualmente se encuentra en un directorio de administración fuera de la carpeta de mi proyecto. ¿Tengo que crear un enlace simbólico?

Lo siento por las preguntas de los novatos. Agradecería cualquier sugerencia (lo más detallada posible).

+0

¿Qué navegador está usando? ¿Qué complementos (si hay) tiene instalado y cómo están configurados? En FF * Tab Mix Plus * (entre otros) es capaz de cambiar radicalmente el comportamiento de una ventana emergente/ventana nueva. –

+0

Estoy usando Firefox. Pero no creo que tenga que ver con los complementos/configuración. La funcionalidad de administración funciona perfectamente dentro del sitio de administración. Cuando trato de usarlo fuera de este marco, no logro que funcione correctamente. –

Respuesta

4

También he creado una aplicación que sólo puede incluir en su proyecto en http://github.com/sontek/django-tekextensions

+0

Buena respuesta pero necesita actualización. Por ejemplo, "ADMIN_MEDIA_PREFIX" está en desuso. django-tekextensions sería bueno si tuviera al fin descripción ...;] –

+2

su blog enlace está roto –

+2

Siempre es recomendable citar de la página que se está ligando. En caso de que el enlace se rompa en el futuro, la respuesta sigue siendo válida. –

5

siguiendo los pasos descritos a continuación le permitirá volver a crear la funcionalidad emergente objeto relacionado de Django administrador sin tener que crear ningún widgets personalizados, vistas y urls. Estos pasos suponen que está tratando de hacer que esta ventana emergente funcione en su propio sitio de administración personalizado que subclasifica el administrador de Django.

Asumamos que los dos modelos siguientes Libro y Autor, con un FK del libro de Autor. Supongamos también que vamos a querer la capacidad de utilizar la objeto relacionado Pop-Up añadir un autor al crear/editar un libro:

[APP_NAME] /models.py:

from django.db import models 

class Author(models.Model): 
    name = models.CharField(max_length=200) 

class Book(models.Model): 
    author = models.ForeignKey(Author) 
    title = models.CharField(max_length=200) 

Vamos a crear nuestro sitio de administración personalizada:

[APP_NAME] /sites.py:

from django.contrib.admin.sites import AdminSite 

my_admin_site = AdminSite(name='my_custom_admin') 

Nuestro sitio de administración personalizada registrará dos ModelAdmins para permitir a los usuarios añadir/editar/borrar tanto los modelos de libros y autor:

[APP_NAME] /admin.py:

from django.contrib.admin.options import ModelAdmin 

from [app_name].forms import BookForm # We'll create this form below 
from [app_name].models import Author, Book 
from [app_name].sites import my_admin_site 

class BookModelAdmin(ModelAdmin): 
    form = BookForm() 

# Register both models to our custom admin site 
my_admin_site.register(Author, ModelAdmin) 
my_admin_site.register(Book, BookModelAdmin) 

Ahora, Configuraremos el BookForm que se usa en el BookModelAdmin anterior. Aquí es donde sucede la magia. Para obtener más información sobre la API de RelatedFieldWidgetWrapper, click here:

[app_name]/forms.PY:

from django.contrib.admin.widgets import RelatedFieldWidgetWrapper 
from django import forms 

from [app_name].models import Book 
from [app_name].sites import my_admin_site 

class BookForm(forms.ModelForm): 
    author = Book._meta.get_field('author').formfield(
     widget=RelatedFieldWidgetWrapper(
      Book._meta.get_field('author').formfield().widget, 
      Book._meta.get_field('author').rel, 
      my_admin_site, 
      can_add_related=True 
     ) 
    ) 

    class Meta: 
     model = Book 

Notas:

  1. Usted tendrá que asegurarse de que estos dos archivos javascript incluidos en las plantillas: admin/js/core.js y admin/js/admin/RelatedObjectLookups.js.

Gotchas:

  1. is_popup necesita ser establecido y aprobado correctamente en sus plantillas. Específicamente, en cualquier plantilla personalizada change_form.html que sobrescriba, debe recordar agregar esta línea en algún lugar dentro de sus etiquetas de formulario: {% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %}, de modo que la lógica en BaseModelAdmin.response_add() devuelva la respuesta correcta.

debajo de la capilla: Esencialmente, estamos re-uso de la lógica de procesamiento de formularios, envoltura widget y Javascript que ya está incluido con Django administrador.

  1. Usando RelatedFieldWidgetWrapper para envolver el widget asociado al campo objeto relacionado en nuestra forma (y pasando específicamente can_add_related=True en el constructor) cuenta el widget para añadir el enlace necesario '+' con el evento onclick javascript apropiado unido a él .
  2. El javascript de Django admin maneja toda la lógica necesaria para iniciar la ventana emergente.
  3. La lógica {% if is_popup %}...{% endif %} en nuestra (s) plantilla (s) change_form.html y la lógica en BaseModelAdmin.response_add() maneja el guardado del nuevo objeto relacionado y devuelve la respuesta javascript apropiada que informa al pop-up que necesita ser cerrado.

Repo relacionadas: Esta recompra pública debe proporcionar el código de ejemplo para el proyecto de Django se discutió anteriormente: https://github.com/cooncesean/Books

+0

¡Tks, exactamente lo que necesitaba! Por cierto, ahora se puede sobrescribir el widget dentro de la clase Meta en lugar de volver a escribir todo el campo -> https://docs.djangoproject.com/en/1.7/topics/forms/modelforms/#overriding-the-default-fields – alfetopito

2

Google me señaló a esta página al buscar cómo conseguir un icono "+" junto a los campos en una forma personalizada con una relación ForeignKey (como lo haría el sitio de administración), así que pensé en agregar.

Para mí, usar django-autocomplete-light hizo el truco muy bien, usando la funcionalidad "agregar otro". Ver this live demo.

Consulte Django ModelChoiceField has no plus button también.

-1

Si en el administrador desea mostrar objetos relacionados en modales en lugar de viejas ventanas emergentes sugiero que pruebe la django-admin-interface.

Para instalarlo siga estos pasos:

  • pip install django-admin-interface
  • Añadir admin_interface, flat_responsive y colorfield a settings.INSTALLED_APPSantesdjango.contrib.admin
  • python manage.py migrate
  • python manage.py collectstatic

Para información más detallada, ver django-admin-interface en GitHub.