#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, вы получите сообщение «это поле обязательно», которое затем вы можете отобразить пользователю.