Ищите хороший пример использования get_or _create в представлениях Django и вызываете ошибку формы - PullRequest
1 голос
/ 13 апреля 2010

Я ищу хороший пример того, как добиться следующего:

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

Представление содержит:

p, created = Person.objects.get_or_create(
   email = registration_form.cleaned_data['email'],
   defaults = {
       'creationDate': datetime.datetime.now(),                
       'dateOfBirth': datetime.date(1970,1,1)
})

Таким образом, 'p' будет содержать существующего Человека, если он существует, или нового Человека, если нет. Я хотел бы применить к логическому значению в «созданном», чтобы пропустить сохранение Персоны, повторно отобразить форму регистрации и вызвать соответствующую ошибку проверки формы.

Альтернативой, которую я рассматриваю, является проверка в пользовательском методе проверки формы, чтобы увидеть, существует ли Person с данными в предоставленном поле 'email', и просто выдача ошибки проверки.

1 Ответ

3 голосов
/ 13 апреля 2010

Это не хороший пример использования get_or_create. Проверка формы (которую вы, очевидно, пытаетесь сделать) происходит перед сохранением, и их вообще не следует смешивать. Вы должны быть уверены, что ваша форма проверена перед сохранением, но проверка «уже существует» является частью проверки.

В методе clean () вашей формы напишите что-то вроде этого:

try:
    Person.objects.get(email=...)
    raise forms.ValidationError(...)
except Person.DoesNotExist:
    pass

Это предложенная вами альтернатива и наиболее разумное решение.

Хорошее использование get_or_create - это, например, библиотека тегов, где вы хотите, чтобы новые теги создавались на лету, или информация о старых собранных тегах, без необходимости писать попробовать / исключить все время.

Редактировать: также, если вы хотите сделать это, чтобы избежать последующего цикла получения / создания, убедитесь, что вы используете модели. Метод save modelforms возвращает вам только что созданный экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...