У django DateTimeField нет ошибки по умолчанию - PullRequest
6 голосов
/ 10 мая 2011

Я новичок в разработке 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 !!!

Спасибо

Ответы [ 3 ]

12 голосов
/ 10 мая 2011

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

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

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)
4 голосов
/ 02 октября 2013

В 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()
0 голосов
/ 10 мая 2011

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

...