pythondjangodatepickermodelform

How to use a DatePicker in a ModelForm in django?


I am using django 3.0 and I am trying to display a datepicker widget in my ModelForm, but I can't figure out how (all I can get is text field). I have tried looking for some solutions, but couldn't find any. This is how my Model and my ModelForm look like:

class Membership(models.Model):
  start_date = models.DateField(default=datetime.today, null=True)
  owner = models.ForeignKey(Client, on_delete=models.CASCADE, null=True)
  type = models.ForeignKey(MembershipType, on_delete=models.CASCADE, null=True)

class MembershipForm(ModelForm):
  class Meta:
    model = Membership
    fields = ['owner', 'start_date', 'type']
    widgets = {
        'start_date': forms.DateInput
    }

And this is my html:

<form class="container" action="" method="POST">
{% csrf_token %}
{{ form|crispy }}
<button type="submit" class="btn btn-primary">Submit</button>
</form>

Solution

  • 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>