2010-02-27 7 views
7

Ce sujet est assez commun (le plus explicitement détaillé ici: http://www.hoboes.com/Mimsy/hacks/replicating-djangos-admin/), mais j'ai toujours des problèmes avec cela. J'essaie d'utiliser la fonctionnalité du bouton "plus" utilisée dans le site d'administration où l'on peut ajouter une clé étrangère supplémentaire à une entrée liée. Dans le site d'administration, une fenêtre contextuelle s'affiche permettant à l'utilisateur de soumettre un nouveau champ, puis cette nouvelle valeur est renseignée sur le formulaire d'origine.Fonctionnalité de popup Admin de Django

Je pense que mes centres d'émission autour de l'inclusion de cette ligne:

dans le modèle base.html et le modèle de popadd.html. Cliquer sur le bouton plus n'appelle pas une nouvelle fenêtre. Le modèle popadd se charge simplement dans le même onglet. Et soumettre une nouvelle entrée ne ramène pas l'utilisateur au formulaire d'origine.

Le site d'administration est fonctionnel. J'inclus ADMIN_MEDIA_PREFIX = '/ media/admin /' dans le fichier settings.py. Cela a-t-il quelque chose à voir avec l'endroit où le RelatedObjectLookups.js vit? Il est actuellement dans un répertoire d'administration en dehors de mon dossier de projet. Dois-je créer un lien symbolique?

Désolé pour les questions Noob. Apprécierait des suggestions (aussi détaillées que possible).

+0

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. –

+0

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. –

Répondre

4

J'ai aussi créé une application que vous pouvez simplement inclure dans votre projet à http://github.com/sontek/django-tekextensions

+0

Bonne réponse mais doit être mise à jour. Par exemple "ADMIN_MEDIA_PREFIX" est obsolète. django-tekextensions serait bien si elle avait au moins une description ...;] –

+2

Votre lien de blog est actuellement cassé –

+2

Il est toujours conseillé de citer de la page que vous liez. En cas de rupture du lien dans le futur, la réponse reste valable. –

5

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:

  1. 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:

  1. 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.

  1. 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 .
  2. Le javascript de Django admin gère toute la logique nécessaire pour lancer la pop-up.
  3. 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

+0

Tks, exactement ce dont j'avais besoin! BTW, vous pouvez maintenant remplacer le widget dans la classe Meta plutôt que de réécrire le champ entier -> https://docs.djangoproject.com/fr/1.7/topics/forms/modelforms/#overriding-the-default-fields – alfetopito

2

Google m'a pointé cette page lorsque vous recherchez comment obtenir une icône « + » à côté des champs dans un formulaire personnalisé avec une relation ForeignKey (tout comme le ferait le site d'administration), alors j'ai pensé que j'ajouterais.

Pour moi, l'utilisation de django-autocomplete-light a très bien réussi, en utilisant la fonctionnalité «ajouter un autre». Voir this live demo.

Voir aussi Django ModelChoiceField has no plus button.

-1

Si dans le admin que vous souhaitez afficher objets liés dans modaux au lieu de vieilles fenêtres pop-up Je vous suggère d'essayer le django-admin-interface.

Pour l'installer, procédez comme suit:

  • pip install django-admin-interface
  • Ajouter admin_interface, flat_responsive et colorfield à settings.INSTALLED_APPSavantdjango.contrib.admin
  • python manage.py migrate
  • python manage.py collectstatic

Pour plus d'informations, voir django-admin-interface sur GitHub.