Widget calendrier Django sous forme personnalisée

j'essaie d'ajouter une date de calendrier à l'un de mes formulaires. Il y a un merveilleux widget de calendrier que Django utilise sur ses pages d'administration, mais je n'arrive pas à trouver comment l'ajouter à un formulaire personnalisé.

j'ai trouvé quelques autres questions sur le même sujet ici, mais elles semblaient toutes périmées, compliquées, et ne pas fonctionner.

y a-t-il un moyen d'inclure le widget calendrier de Django dans l'un de mes formulaires?

16
demandé sur Matt Johnson 2011-03-27 17:47:15

5 réponses

au lieu du widget administrateur, envisagez d'utiliser le "SelectDateWidget" normal intégré dans Django:https://docs.djangoproject.com/en/1.8/ref/forms/widgets/#selectdatewidget

14
répondu rogueleaderr 2015-09-12 22:38:51

Je l'ai compris, grâce à Dave S. et un certain nombre de vieux billets sur ce sujet. Ma méthode:

Créer un formulaire personnalisé.

en haut, importez les widgets admin en utilisant from django.contrib.admin.widgets import AdminDateWidget. Ensuite, ajoutez les différents champs de votre formulaire, en utilisant my_field = DateField(widget = AdminDateWidget) chaque fois que vous voulez utiliser le widget date.

Créer votre modèle de formulaire

placer ce qui suit vers le haut pour inclure les fichiers CSS/js appropriés:

{% load i18n admin_modify adminmedia %}
{% block extrahead %}{{ block.super }}
<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/base.css" />
<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/widgets.css" />
<script type="text/javascript" src="/jsi18n/"></script>
<script type="text/javascript" src="{% admin_media_prefix %}js/core.js"></script>
{{ form.media }}
{% endblock %}

Note: Vous n'avez pas nécessairement besoin de tout cela, en fonction de votre version de Django et de la façon dont vous mettez en œuvre les champs de formulaire. c'est ce que j'ai trouvé que j'avais besoin d'utiliser les widgets.

maintenant, il suffit de sortir votre formulaire comme normal, et le JS devrait automatiquement le convertir en champ date. Profitez-en!

10
répondu MrGlass 2011-03-28 05:50:22

tous les widgets utilisés par django-admin sont dans le django/contrib/admin/widgets.py file. Il suffit d'utiliser cela comme un widget habituel dans une forme. Ce que vous voulez est AdminDateWidget.

from django.contrib.admin.widgets import AdminDateWidget
from django.forms.fields import DateField

class MyForm(Form):
    my_field = DateField(widget=AdminDateWidget)

qui va créer une date-picker avec calendrier. Vous pouvez essayer de le personnaliser à ce que vous avez besoin en l'étendant ou créer un nouveau widget à partir d'une égratignure avec une inspiration de AdminDateWidget.

6
répondu davekr 2018-01-10 15:54:28

Vous pouvez le faire par le widget de forme "SelectDateWidget ()" comme cet exemple:

class MyForm(forms.Form):

        start_date=forms.DateField(widget = forms.SelectDateWidget())
        end_date=forms.DateField(widget = forms.SelectDateWidget())
1
répondu Projesh Bhoumik 2017-08-15 09:37:23

il s'agit essentiellement d'un duplicata de utilisation des widgets Django time/date sous forme personnalisée.

la réponse a été donnée par @Dave S et @MrGlass, mais pour Django 1.2 et plus tard, cela sera également nécessaire pour aider le JavaScript à trouver le média d'administration:

{% load adminmedia %} /* At the top of the template. */

/* In the head section of the template. */
<script type="text/javascript">
window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}";
</script>

( réponse de Carl Meyer)

0
répondu Herman Schaaf 2017-05-23 12:32:29