Создайте объект перед вызовом метода сохранения - PullRequest
2 голосов
/ 27 ноября 2010

Я хочу создать объект в Django перед вызовом метода save.Этот объект будет создан из значения ForeignKey. Я изменил поле Foreignkey так, чтобы оно выглядело как поле ввода, чтобы записать значение вместо его выбора.

У меня есть 2 класса в 2 разных файлах модели

class Category(models.Model):
    title = models.ForeignKey(Title, verbose_name="Title")

и

class Title(models.Model):
    title = models.CharField("Title", primary_key=True, max_length=200)

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

Select a valid choice. That choice is not one of the available choices.

Я хочу создать заголовок на основе того, что я пишу в поле ForeignKey, перед созданием категории, чтобы его можно было использовать немедленно.

Iпопытался переопределить метод save для сохранения титровального объекта перед сохранением категории, но он не сработал.

Любая помощь будет по достоинству оценена.

Спасибо

Ответы [ 3 ]

1 голос
/ 29 ноября 2010

Спасибо за ваш код, я только что проверил его.Но это не совсем то, что я ищу, я объясню, что я хочу сделать.

Допустим, в нашей модели есть классы Category и Article, каждый из которых имеет заголовок.Чтобы сделать этот заголовок многократно используемым, я создал другое приложение, которое будет управлять полями, я создал класс Title и добавил его в качестве иностранного ключа в формы Category и Article.

Я переключил поле выбора на поле ввода, используя raw_id_fields.

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

Я пытался сделать это в методе сохранения, в сигнале pre_save и в методе clean, но я всегда получаю сообщение об ошибке "Выберите правильный выбор. Этот выбор не является одним издоступные варианты. "

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

t = Title(title = "MyTitle")
t.save()

Я пытался создать категорию с заголовком MyTitle, но я получаю ту же ошибку при попыткесоздайте другой, используя существующий заголовок, он работает, и заголовок «MyTitle» создан.Это означает, что создание объекта происходит после проверки формы.То, что я хочу, это просто делать это раньше.Титульный объект должен быть создан до проверки.

Большое спасибо за помощь

1 голос
/ 27 ноября 2010

Сохранение выполняется после проверки формы, вы можете создать категорию объекта во время проверки.

Посмотрите на чистые методы полей формы, которые вы можете переопределить в django docs http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

0 голосов
/ 27 ноября 2010

Возможно, вам следует подумать о том, чтобы поместить код для создания записей категории в менеджере модели:

class CategoryManager(Manager):
    def create_category(category, title):
        t = Title.objects.get_or_create(title=title)
        return self.create(title=t)

class Category(models.Model):
    title = models.ForeignKey(Title, verbose_name="Title")
    objects = CategoryManager()

Затем используйте create_category каждый раз, когда вы хотите создать категорию.

...