suivant les étapes décrites ci-dessous vous permettra de recréer objet associé fonctionnalité pop-up admin Django sans avoir à créer des widgets personnalisés, vues et urls. Ces étapes supposent que vous essayez de faire fonctionner cette fenêtre contextuelle dans votre propre site d'administration personnalisé qui sous-classe l'administrateur de Django.
Lets assumer les deux modèles suivants Réservez et Auteur, avec un livre de FK à l'auteur. Supposons aussi que nous voulons la possibilité d'utiliser l'objet connexes Pop-Up ajouter un auteur lors de la création/édition d'un livre:
[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)
Créons notre site admin personnalisé:
[APP_NAME] /sites.py:
from django.contrib.admin.sites import AdminSite
my_admin_site = AdminSite(name='my_custom_admin')
Notre site d'administration personnalisé enregistre deux ModelAdmins pour permettre aux utilisateurs d'ajouter/modifier/supprimer à la fois les modèles livre et l'auteur:
[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)
Maintenant, nous configurera le BookForm
qui est utilisé dans le BookModelAdmin
ci-dessus. C'est là que la magie se produit. Pour plus d'informations sur l'API relatedFieldWidgetWrapper, click here:
[nom_app]/formulaires.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
Notes:
- Vous devez vous assurer que ces deux fichiers javascript inclus dans vos modèles:
admin/js/core.js
et admin/js/admin/RelatedObjectLookups.js
.
Gotchas:
is_popup
doit être réglé et transmis correctement dans vos modèles. Plus précisément, dans tous les modèles personnalisés que vous remplacez, vous devez vous souvenir d'ajouter cette ligne quelque part dans vos balises de formulaire: {% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %}
, de sorte que la logique dans BaseModelAdmin.response_add()
renvoie la réponse correcte.
sous le capot: Essentiellement, nous réutilisant la logique de traitement de forme, wrapper widget et javascript qui est déjà inclus avec Django admin.
- En utilisant
RelatedFieldWidgetWrapper
pour envelopper le widget associé au champ objet lié à notre forme (et en passant spécifiquement can_add_related=True
dans le constructeur) tells le widget pour ajouter le lien « + » nécessaire à l'événement onclick javascript approprié attaché à lui .
- Le javascript de Django admin gère toute la logique nécessaire pour lancer la pop-up.
- La logique
{% if is_popup %}...{% endif %}
dans notre change_form.html
modèle (s) et la logique dans BaseModelAdmin.response_add()
gère la sauvegarde du nouvel objet associé et renvoie la réponse javascript appropriée qui informe la pop-up qu'il doit être fermé.
Repo connexes: Cette prise en pension publique devrait fournir des exemples de code pour le projet Django discuté ci-dessus: https://github.com/cooncesean/Books
Quel navigateur utilisez-vous? Quels plugins (le cas échéant) avez-vous installés et comment sont-ils configurés? En FF * Tab Mix Plus * (entre autres) est capable de changer radicalement le comportement d'une popup/nouvelle fenêtre. –
J'utilise firefox. Mais je ne pense pas que cela a à voir avec les plugins/configuration. La fonctionnalité d'administration fonctionne parfaitement sur le site d'administration. C'est quand j'essaie de l'utiliser en dehors de ce cadre que je n'arrive pas à le faire fonctionner correctement. –