2010-06-05 7 views
0

J'ai un widget personnalisé que je voudrais mettre à la disposition d'une page d'administration Django. Ceci est facilement implémenté en utilisant l'attribut formfield_overrides d'une sous-classe ModelAdmin, et en utilisant la classe enfant Media, je peux définir le JavaScript et le CSS nécessaires pour ce widget. Cela fonctionne plutôt bien. Le seul problème est que mon widget personnalisé nécessite MooTools pour fonctionner correctement, ce qui semble entrer en conflit avec jQuery et casse les widgets Django Admin par défaut (à savoir les sélecteurs de date et d'heure).Widgets personnalisés utilisant MooTools sur les pages d'administration de Django

Je pense que MooTools et jQuery modifient Object.prototype, et puisque MooTools est chargé après jQuery, il semble que ce soit en train de surcharger les modifications de jQuery. DateTimeShortcuts.init(), qui est responsable du rendu des boutons du sélecteur de date et d'heure, n'est pas appelé automatiquement si MooTools est chargé.

Je suis en quelque sorte dans un pickle ici, parce que je veux être en mesure d'utiliser les widgets d'administration intégrés, mais mon widget personnalisé est tout aussi important, sinon plus. Le widget est utilisé dans toute mon application, qui utilise MooTools, donc je ne peux pas changer de frameworks, et je préfère ne pas maintenir deux widgets qui effectuent la même fonction en utilisant des frameworks différents. Est-ce que quelqu'un a des suggestions sur comment je peux autour de ce conflit?

Répondre

0

MooTools 1.2.3+ dispose de quelques précautions pour travailler avec jQuery (et d'autres bibliothèques qui ne modifient pas les prototypes). Tout d'abord, vous devez ajouter MooTools après jQuery, puis vous abstenir d'utiliser la fonction $ dans votre code MooTools et utiliser à la place document.id.
De cette façon, la fonction $ sera toujours la « propriété » jQuery (sauf si vous utilisez jQuery.noConflict)

Tout conflit restant après vous éviter d'utiliser la fonction $ pourrait être due à certains plugins jQuery en utilisant for ... in à boucle via un tableau sans la sauvegarde hasOwnProperty correspondante.

Pour mémoire, jQuery ne modifie pas le prototype (toutes les fonctions sont appelées sur l'espace de noms jQuery) et MooTools ne modifie pas Object.prototype depuis la version 1.2

modifier: une chose: vérifier aussi pour toute pollution de l'espace de noms introduit par les plugins jQuery, j'ai souvent trouvé des plugins injectant des fonctions dans l'espace de noms global et des propriétés dans les éléments DOM qui étaient en conflit avec ceux utilisés dans MooTools.

+0

Merci pour votre réponse; après si longtemps, j'avais peur que personne ne s'avance. J'utilise MooTools 1.2.4. Mon code vérifie si la fonction '$' a un attribut 'noConflict', et si c'est le cas, l'appelle et ré-implémente la fonction MooTools. La seule raison pour laquelle je soupçonnais 'Object.prototype' d'être modifié était parce que je ne trouve nulle part la méthode' DateTimeShortcuts.init() 'est appelée, donc j'ai supposé que jQuery était responsable. J'ai depuis longtemps enlevé ceci de mon code de base, mais j'essaierai encore en utilisant vos autres suggestions. – AdmiralNemo