How To Use A DatePicker In A ModelForm In Django?
Solution 1:
Although @willem-van-onsem's answer is great, there are a few alternatives that do not require additional dependencies.
A few options, in order of increasing effort:
Use a SelectDateWidget instead of the default DateInput (no JavaScript required):
class MyForm(forms.Form): date = forms.DateField(widget=forms.SelectDateWidget())Use the browser's built-in date picker, by implementing a customized widget that uses the HTML <input type="date"> element (no JavaScript required):
class MyDateInput(forms.widgets.DateInput): input_type = 'date' class MyForm(forms.Form): date = forms.DateField(widget=MyDateInput())or, alternatively:
class MyForm(forms.Form): date = forms.DateField(widget=forms.DateInput(attrs=dict(type='date')))Use the date picker from
django.contrib.admin, as described here in detail. In short, there are a few things you would need:from django.contrib.admin.widgets import AdminDateWidget ... class MyForm(forms.Form): date = forms.DateField(widget=AdminDateWidget())then, to make this work, add the following dependencies to your template
<head>:<link type="text/css" href="{% static 'admin/css/widgets.css' %}" /> <script src="{% static 'admin/js/core.js' %}"></script> <script src="{% url 'admin:jsi18n' %}"></script> {# see note below #} {{ form.media }} {# this adds 'calendar.js' and 'DateTimeShortcuts.js' #}Now there's one catch: the
admin:jsi18nurl only works for users with admin access, so you may need to replace this and define an alternative path in yoururls.py, e.g.:from django.views import i18n ... urlpatterns = [ ..., path('jsi18n/', i18n.JavaScriptCatalog.as_view(), name='jsi18n'), ]
Finally, here's what the widgets look like (on firefox):
Personally I like the second option best. It also allows us to specify initial, minimum and maximum values (in django you can do this e.g. using the attrs argument). Here's a quick snippet to show the HTML element in action:
<input type="date" value="2021-09-09" min="2021-09-09">
Solution 2:
This is the expected behavior. A DateInput widget [Django-doc] is just a <input type="text"> element with an optional format parameter.
You can make use of a package, like for example django-bootstrap-datepicker-plus [pypi]
, and then define a form with the DatePickerInput:
from bootstrap_datepicker_plus import DatePickerInput
class MembershipForm(ModelForm):
class Meta:
model = Membership
fields = ['owner', 'start_date', 'type']
widgets = {
'start_date': DatePickerInput
}
In the template you will need to render the media of the form and load the bootstrap css and javascript:
{% load bootstrap4 %}
{% bootstrap_css %}
{% bootstrap_javascript jquery='full' %}
{{ form.media }}
<form class="container" action="" method="POST">
{% csrf_token %}
{{ form|crispy }}
<button type="submit" class="btn btn-primary">Submit</button>
</form>
Post a Comment for "How To Use A DatePicker In A ModelForm In Django?"