Comment puis-je utiliser les gadgets JavaScript de date et d'heure astucieux que l'administrateur par défaut utilise avec ma vue personnalisée?
J'ai parcouru la documentation des formulaires Django , et elle mentionne brièvement django.contrib.admin.widgets, mais je ne sais pas comment l'utiliser?
Voici mon modèle sur lequel je veux qu'il soit appliqué.
<form action="." method="POST">
<table>
{% for f in form %}
<tr> <td> {{ f.name }}</td> <td>{{ f }}</td> </tr>
{% endfor %}
</table>
<input type="submit" name="submit" value="Add Product">
</form>
Aussi, je pense qu'il convient de noter que je n'ai pas vraiment écrit moi-même une vue pour ce formulaire, j'utilise une vue générique. Voici l'entrée de url.py:
(r'^admin/products/add/$', create_object, {'model': Product, 'post_save_redirect': ''}),
Et je suis tout à fait nouveau dans tout Django / MVC / MTV, alors allez-y doucement ...
Réponses:
La complexité croissante de cette réponse au fil du temps et les nombreux hacks requis devraient probablement vous mettre en garde contre le fait de faire cela. Il repose sur des détails d'implémentation internes non documentés de l'administrateur, risque de se rompre à nouveau dans les futures versions de Django, et n'est pas plus facile à implémenter que de simplement trouver un autre widget de calendrier JS et de l'utiliser.
Cela dit, voici ce que vous devez faire si vous êtes déterminé à faire en sorte que cela fonctionne:
Définissez votre propre sous-classe ModelForm pour votre modèle (il est préférable de la mettre dans forms.py dans votre application) et dites-lui d'utiliser AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (remplacez 'mydate', etc. par les noms de champ appropriés de votre modèle):
Modifiez votre URLconf pour passer 'form_class': ProductForm au lieu de 'model': Product à la vue générique create_object (cela signifiera "from my_app.forms import ProductForm" au lieu de "from my_app.models import Product", bien sûr).
Dans la tête de votre modèle, incluez {{form.media}} pour afficher les liens vers les fichiers Javascript.
Et la partie hacky: les widgets de date / heure d'administration supposent que le contenu de l'i18n JS a été chargé, et nécessitent également core.js, mais ne fournissent ni l'un ni l'autre automatiquement. Donc, dans votre modèle ci-dessus {{form.media}}, vous aurez besoin de:
Vous pouvez également utiliser le CSS d'administration suivant (merci Alex d' avoir mentionné cela):
Cela implique que le support d'administration de Django (ADMIN_MEDIA_PREFIX) se trouve dans / media / admin / - vous pouvez changer cela pour votre configuration. Idéalement, vous utiliseriez un processeur de contexte pour transmettre ces valeurs à votre modèle au lieu de le coder en dur, mais cela dépasse le cadre de cette question.
Cela nécessite également que l'URL / my_admin / jsi18n / soit câblée manuellement à la vue django.views.i18n.javascript_catalog (ou null_javascript_catalog si vous n'utilisez pas I18N). Vous devez le faire vous-même au lieu de passer par l'application d'administration afin qu'elle soit accessible, que vous soyez connecté ou non à l'administrateur (merci Jeremy de l' avoir signalé). Exemple de code pour votre URLconf:
Enfin, si vous utilisez Django 1.2 ou une version ultérieure, vous avez besoin d'un code supplémentaire dans votre modèle pour aider les widgets à trouver leur média:
Merci lupefiasco pour cet ajout.
la source
Comme la solution est hackish, je pense que l'utilisation de votre propre widget date / heure avec du JavaScript est plus faisable.
la source
Oui, j'ai fini par remplacer le / admin / jsi18n / url.
Voici ce que j'ai ajouté dans mes urls.py. Assurez-vous qu'il est au-dessus de / admin / url
Et voici la fonction i18n_javascript que j'ai créée.
la source
Je me retrouve souvent à faire référence à cet article et j'ai trouvé que la documentation définit un peu moins pirate de remplacer les widgets par défaut.
( Pas besoin de remplacer la méthode __init__ de ModelForm )
Cependant, vous devez toujours câbler votre JS et CSS de manière appropriée, comme Carl le mentionne.
forms.py
Référencez les types de champs pour trouver les champs de formulaire par défaut.
la source
Mon code de tête pour la version 1.4 (certains nouveaux et certains supprimés)
la source
À partir de Django 1.2 RC1, si vous utilisez l'astuce du sélecteur de date d'administration Django, ce qui suit doit être ajouté à votre modèle, ou vous verrez l'url de l'icône de calendrier référencée via "/ missing-admin-media-prefix / ".
la source
En complément de la réponse de Carl Meyer, je voudrais faire remarquer que vous devez mettre cet en-tête dans un bloc valide (à l'intérieur de l'en-tête) dans votre modèle.
la source
Pour Django> = 2.0
Étape 1: ajoutez une
javascript-catalog
URL auurls.py
fichier de votre projet (pas de l'application) .Étape 2: Ajoutez les ressources JavaScript / CSS requises à votre modèle.
Étape 3: utilisez les widgets d'administration pour les champs de saisie de date et d'heure dans votre
forms.py
.la source
Ce qui suit fonctionnera également en dernier recours si ce qui précède a échoué
Pareil que
mettez ceci dans vos forms.py
from django.forms.extras.widgets import SelectDateWidget
la source
Qu'en est-il simplement d'assigner une classe à votre widget, puis de lier cette classe au sélecteur de date JQuery?
Django forms.py:
Et du JavaScript pour le modèle:
la source
Solution mise à jour et solution de contournement pour SplitDateTime avec required = False :
forms.py
form.html
urls.py
la source
J'utilise ça, c'est super, mais j'ai 2 problèmes avec le template:
Et pour TimeField, j'ai « Entrez une date valide. '
models.py
forms.py
la source
Dans Django 10. myproject / urls.py: au début des urlpatterns
Dans mon template.html:
la source
Ma configuration Django: 1.11 Bootstrap: 3.3.7
Comme aucune des réponses n'est complètement claire, je partage mon code de modèle qui ne présente aucune erreur.
Moitié supérieure du modèle:
Moitié inférieure:
la source
3 juin 2020 (Toutes les réponses n'ont pas fonctionné, vous pouvez essayer cette solution que j'ai utilisée. Juste pour TimeField)
Utilisez des
Charfield
champs simples pour l'heure ( début et fin dans cet exemple) dans les formulaires.forms.py
nous pouvons utiliser
Form
ouModelForm
ici.Convertit l'entrée de chaîne en objet de temps dans les vues.
la source