Обязательные поля в профилях пользователей в Django - PullRequest
2 голосов
/ 01 ноября 2011

Я слежу за Начинаю Django E-Commerce , но я нашел часть, касающуюся профилей пользователей, немного озадачивающей. По сути, у меня есть абстрактный класс, подобный этому:

class BaseOrderInfo(models.Model):
  class Meta:
    abstract = True
    # a bunch of fields follow
    shipping_name = models.CharField()
    # etc

После этого класс UserProfile наследует BaseOrderInfo:

class UserProfile(BaseOrderInfo):
  user = models.ForeignKey(User, unique = True)
  # Possibly other methods or fields here

Наконец, существует метод извлечения, который, как следует из его названия, извлекает профиль пользователя (если этот профиль пользователя не существует, он создает его для этого объекта User):

def retrieve(request):
  try:
    profile = request.user.get_profile()
  except UserProfile.DoesNotExist:
    profile = UserProfile(user=request.user)
    profile.save()
  return profile

Что ж, мой вопрос заключается в следующем: как можно сохранить этот экземпляр UserProfile в методе retrieve, только добавив экземпляр User, учитывая тот факт, что UserProfile унаследовал довольно много других полей от класса BaseOrderInfo? Насколько я знаю, Model и ModelForm создают обязательные поля по умолчанию.

Спасибо

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Django не проверяет модель при сохранении формы. (См. Документы по Проверка объектов ). Если вы явно позвоните profile.full_clean() перед сохранением, вы увидите ошибки проверки.

Если требуемый внешний ключ не указан, вы получите базу данных IntegrityError. Другие обязательные поля проверяются Django, а не базой данных. Если Django не проверит модель, не будет ошибок при сохранении пустой строки в CharField в базе данных.

1 голос
/ 01 ноября 2011

Если UserProfile имеет какие-либо обязательные поля, вам необходимо предоставить пользователю форму для сбора этих данных. Вы можете интегрировать ее в свою регистрационную форму или просто представить отдельную форму профиля, когда вам нужно получить доступ к данным профиля пользователя, но определить, что профиль еще не существует.

...