0
votes

Le widget Django DateInput () ne fonctionne pas dans ModelForm

Je crée un formulaire de connexion utilisateur avec un modèle CustomUser dérivé de AbstractUser, avec un champ supplémentaire: date_of_birth. J'utilise CreateView pour générer le formulaire. Tous les champs s'affichent, le champ de mot de passe utilise le widget de mot de passe comme prévu (affichant des points au lieu de caractères), mais le champ de date ne le fait pas (champ de caractères simples sans mise en forme ni calendrier). Qu'est-ce que je néglige?

models.py:

from django.views.generic.edit import CreateView
from .models import CustomUser
from .forms import CustomUserForm

# Create your views here.
def index(request):
    return HttpResponse("Hello, world")


class CustomUserCreate(CreateView):
    model = CustomUser
    form_class = CustomUserForm

forms.py:

from .models import CustomUser


class CustomUserForm(forms.ModelForm):
    class Meta:
        model = CustomUser
        fields = ["username", "password", "first_name", "last_name", "email", "date_of_birth"]
        widgets = {
            "password": forms.PasswordInput(),
            "date_of_birth": forms.DateInput()
        }

views.py:

from django.urls import reverse
from django.contrib.auth.models import AbstractUser

# Create your models here.
class CustomUser(AbstractUser):
    date_of_birth = models.DateField(verbose_name="Date of Birth", blank=True, null=True)

    def get_absolute_url(self):
        return reverse('index')
    def __str__(self):
        return self.username


1 commentaires

Sur quel navigateur testez-vous? Découvrez ceci .


3 Réponses :


2
votes

Django n'a pas de sélecteur de date intégré. DateField utilise le widget DateInput qui n'est qu'un saisie de texte .


0 commentaires

0
votes

Merci vaudou-burger de m'avoir pointé dans la bonne direction. J'ai trouvé une vidéo avec une solution très simple pour utiliser le sélecteur de date HTML5: https: // www .youtube.com / watch? v = I2-JYxnSiB0 .

Il suffit d'ajouter ce qui suit à forms.py:

class DateInput(forms.DateInput):
    input_type = 'date'

, puis d'utiliser ceci comme widget (remplacez donc forms.DateInput () par DateInput ()).


1 commentaires

Heureux d'avoir pu aider!



4
votes

Si vous venez ici en 2020 et au-delà, remplacez simplement l'entrée par défaut type = text en utilisant 'type' : 'date'

Donc, quelque chose comme ci-dessous fonctionnerait. Testé sur Mozilla Dev Edition 73. +

'date_of_birth': forms.DateInput(attrs={'class':'form-control', 'type':'date'}),


1 commentaires

Vous avez raison, ça marche! Est également décrit dans la documentation: docs.djangoproject .com / fr / 3.0 / ref / forms / widgets /…