ошибка django ‘DateTimeField’ не имеет значения по умолчанию

#django #django-models #django-admin

#django #django-модели #django-admin

Вопрос:

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

 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» в класс A, то при нажатии save() я получаю сообщение, это поле требуется от Django, требует, чтобы я его заполнил!

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

Спасибо

Комментарии:

1. Вам нужно добавить больше деталей для хорошего ответа здесь. Как вы «создаете соответствующий элемент B»? Выполняется ли это в A методе save , как часть post_save сигнала, или вы буквально переходите на страницу добавления / изменения администратора для B и делаете это оттуда? В зависимости от того, какой метод, ответ на ваш вопрос может сильно отличаться.

2. да, я пытался сделать это с помощью элемента save()! я не знаю, что такое post_save, однако я предполагаю, что он вызывается для каждого B, который я сохраняю вместе с A

Ответ №1:

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

Вот как сделать поле необязательным:

 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)
  

Комментарии:

1. мне также пришлось перейти на sqlit, чтобы заставить его работать! дополнительно к вашему предложению

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

Ответ №2:

В 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()
  

Ответ №3:

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