2011-05-10 20 views
6

sono novizio allo sviluppo di django. Io sono la creazione di una classe A che potrebbe avere più di classe B ad esso assegnato:django 'DateTimeField' non ha valore predefinito errore

class A(models.Model):   
    name = models.CharField(max_length=200)  

    def __unicode__(self): 
     self.name 


class B(models.Model): 
    a = models.ForeignKey(A) 
    name = models.CharField(max_length=200) 
    mydate = models.DateTimeField('party date') 

quando sto cercando di creare un nuovo elemento "A" alla pagina di amministrazione, e la creazione di un elemento corrispondente B per esso e poi save(), sto ottenendo l'Attenzione: campo 'mydate' non ha un valore di default

se sposto il "MyDate", elemento di classe a, poi quando colpisce save() sto ottenendo un messaggio Questo campo è richiesto da Django, mi richiede di riempire il campo!

come posso far apparire questo messaggio richiesto anche quando il campo data fa parte di B !!!

Grazie

+0

È necessario aggiungere ulteriori dettagli per una buona risposta qui. Come stai "creando un elemento B corrispondente"? È fatto nel metodo 'Save' di' A', come parte di un segnale 'post_save', o stai andando letteralmente alla pagina di modifica/aggiunta dell'amministratore per' B' e lo fai da lì? A seconda del metodo, la risposta alla tua domanda potrebbe essere molto diversa. –

+0

sì, stavo cercando di farlo attraverso un elemento save()! non so qual è il post_save, tuttavia presumo che sia stato chiamato per ogni B i save insieme a A – sramij

risposta

12

Se non è stato specificato, che il campo è facoltativo, si dovrà fornire un valore per ogni volta che si crea un oggetto. Nel tuo caso non è possibile in modo da avere a che fare una di quelle cose:

Ecco come rendere campo facoltativo:

class B(models.Model): 
    a = models.ForeignKey(A) 
    name = models.CharField(max_length=200) 
    mydate = models.DateTimeField('party date', blank=True, null=True) 

Ecco come si imposta il valore di default:

import datetime 

class B(models.Model): 
    a = models.ForeignKey(A) 
    name = models.CharField(max_length=200) 
    mydate = models.DateTimeField('party date', default=datetime.datetime.now) 
+0

ho dovuto passare a sqlit anche per farlo funzionare! in aggiunta alla nostra proposta – sramij

+0

@sramij, non c'è bisogno di cambiare motore DB, bastava ricreare il database usando 'suncdb'. –

0

Dalla mia comprensione, django proverà a convalidare il modello A e quindi restituirà gli errori di convalida. Dal momento che A convalida, prova a scrivere A che fallisce poiché B non convalida. Non sono sicuro di come farlo elegantemente, ma se provi a valutare il modulo B da solo prima di convalidare A riceverai il messaggio "questo campo è richiesto" che potrai quindi visualizzare all'utente.

4

C'è una funzione di utilità in Django

from django.utils import timezone 
class B(models.Model): 
    a = models.ForeignKey(A) 
    name = models.CharField(max_length=200) 
    mydate = models.DateTimeField('party date', default=timezone.now) 

Questa funzione restituisce un oggetto datetime sulla base di USE_TZ in settings.py

def now(): 
    """ 
    Returns an aware or naive datetime.datetime, depending on settings.USE_TZ. 
    """ 
    if settings.USE_TZ: 
     # timeit shows that datetime.now(tz=utc) is 24% slower 
     return datetime.utcnow().replace(tzinfo=utc) 
    else: 
     return datetime.now() 
Problemi correlati