2011-05-10 4 views
6

Я новичок в разработке django. я создаю класс А, который может иметь несколько классов B, возложенный на него:django 'DateTimeField' не имеет значения по умолчанию

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') 

Когда я пытаюсь создать новый элемент «A» на странице администратора, а также создание соответствующего элемента B для него, а затем save(), я получаю предупреждение: Поле «MyDate» не имеет значения

по умолчанию Если я переместить «MyDate», элемент класса А, то при ударе save() я получаю сообщение Это поле требуется от Django, необходимо заполнить поля!

Как я могу сделать это обязательное сообщение появляться также, когда поле даты является частью B !!!

Благодаря

+0

Вам нужно добавить больше деталей для хорошего ответа здесь. Как вы создаете соответствующий элемент B? Это делается в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' В зависимости от метода, ответ на ваш вопрос может быть совершенно иным. –

+0

Да, я пытался сделать это через элемент save()! Я не знаю, что такое post_save, однако я предполагаю, что его вызывали для каждого B, которого я сохранил вместе с A – sramij

ответ

12

Если вы не указали, что ваше поле не является обязательным, вы должны предоставить значение для него каждый раз, когда вы создаете объект. В вашем случае, если вы не можете, так что вы должны сделать одну из этих вещей:

Вот как сделать поле дополнительно:

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

Вот как вы установите значение по умолчанию:

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

, мне тоже пришлось переходить на sqlit, чтобы он работал! aditionaly к предложению u'r – sramij

+0

@sramij, не нужно менять механизм БД, вам просто нужно было воссоздать базу данных с помощью 'suncdb'. –

0

С моей точки зрения, django попытается проверить модель A, а затем вернуть ошибки проверки. Поскольку A проверяет, он пытается написать A, который не работает, поскольку B не проверяет. Я не уверен, что делать это элегантно, но если вы попробуете оценить форму B самостоятельно, перед проверкой A вы получите сообщение «это поле обязательно», которое вы можете отобразить пользователю.

4

Там есть функция полезности в 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) 

Эта функция вернет вам объект типа DateTime, основанный на USE_TZ в 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() 
Смежные вопросы