2010-07-29 17 views

risposta

15

Si può anche semplicemente utilizzare jQuery nei vostri modelli. Il jQuery DateTime Picker consente ogni personalizzazione.

http://jqueryui.com/demos/datepicker/

+0

Grazie. Non ho mai scavato in JQuery, ma poche ore di lavoro mi hanno portato esattamente dove volevo essere. –

+3

Np, buona fortuna per il tuo progetto. Ma ricorda, Jquery è semplicemente javascript sul lato client. È quindi possibile che qualcuno inserisca i dati nella classe del modulo con dati errati o malevoli, quindi convalida tutto e inserisce le azioni di visualizzazione in una clausola try/except. – Ali

+1

Per la convalida dei dati, utilizzare i moduli di Django (https://docs.djangoproject.com/en/dev/topics/forms/) – Olli

11

Se hai dimestichezza con il widget di data di Django Admin, puoi includerlo nella tua app. Il vantaggio non sono le dipendenze esterne. Qualcuno ha postato un how-to sul gruppo django-utenti qualche tempo fa:

+1

Grazie, Ars! In realtà ho visto il post SO su quel metodo che mi ha un po 'spaventato: http://bit.ly/br5lLG –

0

ho lottato con un problema simile e ho trovato la seguente soluzione gradevole, utilizzando forme floppy:

Questo funziona molto bene ed è relativamente facile da implementare, la speranza che qualcuno lo troverà di aiuto pieno. In bocca al lupo.

2

Essendo più recente per la codifica, ho utilizzato questo esempio a causa della sua facilità.

<form method="POST">{% csrf_token %}   
    <p>Start date<input type = 'date' name='start_date' ></p> 
    <p>End date<input type = 'date' name='end_date' ></p> 
    <button type="submit">Submit</button> 
</form> 
+2

Questo non è un Datepicker. Sebbene alcuni browser possano scegliere di visualizzare un datepicker, non è sicuramente la norma. – spectras

+0

@spectras: In realtà, è * norma * da HTML5, vedere [qui] (http://www.w3schools.com/html/html_form_input_types.asp) o [qui] (http://html5doctor.com/html5 -Forme-input-tipi /). – theV0ID

+1

È normale, come in * "il browser deve sapere che ha una data interna" *. Norm, tuttavia, non dice come deve essere mostrato. Internet Explorer, Firefox e Safari li visualizzeranno tutti come normali caselle di testo, il che è perfetto per la norma ... ma non per quello che l'OP vuole. – spectras

15

seguito è quello che faccio, senza dipendenze esterne a tutti .:

models.py:

from django.db import models 


class Promise(models): 
    title = models.CharField(max_length=300) 
    description = models.TextField(blank=True) 
    made_on = models.DateField() 

forms.py:

from django import forms 
from django.forms import ModelForm 

from .models import Promise 


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


class PromiseForm(ModelForm): 

    class Meta: 
     model = Promise 
     fields = ['title', 'description', 'made_on'] 
     widgets = { 
      'made_on': DateInput(), 
     } 

mio punto di vista:

class PromiseCreateView(CreateView): 
    model = Promise 
    form_class = PromiseForm 

E il mio modello:

<form action="" method="post">{% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Create" /> 
</form> 

Il calendario si presenta così:

enter image description here

+0

Questo non funzionerà in IE o FF. –

+0

Viene visualizzato l'errore "Immettere una data/ora valida" con "datetime-local". Forse anche il validatore deve essere adattato? – qznc

+0

@qznc puoi mostrare il codice e anche la traccia di errore completa? – avi

0

Usa datetime-local come tipo per i input.Its looking.But non molto di fantasia farà il lavoro

Spero che questo aiuti. enter image description here

10

Il supporto di Django TextInput (e tutte le relative sottoclassi) che specifica un attributo di tipo per impostare il tipo di modulo.

È possibile utilizzare questo per impostare il tipo di ingresso per date (W3C specification), ad esempio, nel seguente modo:

date = fields.DateField(widget=forms.widgets.DateInput(attrs={'type': 'date'})) 
+0

Questo funziona davvero bene ... se i clienti utilizzeranno solo il browser Chrome. L'attributo HTML necessario per implementare questo non è attualmente supportato in Safari o Firefox. – William

1

soluzione avi può essere effettuata anche senza l'utilizzo di un ulteriore classe di ingresso django:

class PromiseForm(ModelForm): 

    class Meta: 
     model = Promise 
     fields = ['title', 'description', 'made_on'] 
     widgets = { 
      'made_on': DateInput(attrs={'type': 'date'}), 
     } 
3

In questo momento nel 2018, dopo il rilascio di DJango versione 2, è piuttosto difficile trovare un widget DatePicker ancora funzionante o mantenuto. Raccomando django-bootstrap-datepicker-plus che funziona sorprendentemente sia sulle versioni più recenti che su quelle più vecchie di DJango. L'ho provato in DJango versione 1.10.7 e 2.0.2, funziona bene in entrambe le versioni.

L'installazione è abbastanza semplice. Devi solo installarlo.

pip install django-bootstrap-datepicker-plus 

Aggiungerlo all'elenco delle applicazioni installate nel file settings.py.

INSTALLED_APPS = [ 
     'bootstrap_datepicker', 
     ...other apps... 
    ] 

Importare il widget di nel file forms.py

from bootstrap_datepicker.widgets import DatePicker 

Aggiungi il widget alla campo della data

class ToDoForm(forms.Form): 
     date = forms.DateField(
      widget=DatePicker(
       options={ 
        "format": "mm/dd/yyyy", 
        "autoclose": True 
       } 
      ) 
     ) 

Istruzioni dettagliate sono disponibili sul django-bootstrap-datepicker-plus Github Page.

Problemi correlati