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:
- 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:
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.
- 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 .
- El javascript de Django admin maneja toda la lógica necesaria para iniciar la ventana emergente.
- 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
¿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. –
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. –