2010-11-27 77 views
2

我想在调用save方法之前在Django中创建一个对象。这个对象将从一个ForeignKey值创建,我已经将foreignkey字段更改为输入字段,以便写入值而不是选择它。在调用save方法之前创建一个对象

我有两个班在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字段中写入的内容创建标题,然后创建类别,以便立即使用它。

我试图重新定义保存方法来保存标题对象之前保存类别,但它没有奏效。

任何帮助将非常感激。

谢谢

回答

-1

你或许应该考虑把代码中的模型管理器创建类别条目:

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。

1

谢谢你的代码,我刚刚测试过它。但这不是我正在寻找的东西,我会解释我想要做什么。

假设我们的模型中有Category和Article类,每个类都有一个标题。为了使这个标题可重用,我创建了另一个应用程序来管理字段,我创建了类Title,并将它添加为Category和Article窗体的外键。

我使用raw_id_fields将选择框切换到输入字段。

现在,当我创建一个类别或一篇文章时,我必须选择或写一个标题,当这个标题存在时,它完美的工作,但是当它不存在时,我想在创建类别之前创建它,可以使用它。

我试图在保存方法,pre_save信号和干净的方法中做到这一点,但我总是得到错误“选择一个有效的选择。该选择不是可用的选择之一。“

我正在使用硬编码的解决方案来创建标题,我只想看看它是否可以工作,这些是我在创建类别之前使用不同方法创建标题的行:

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

我试图创建MyTitle作为冠军的范畴,但我得到了同样的错误,当我尝试使用现有的标题就可以创建一个又一个,它的工作原理和标题“MyTitle”被创建。这意味着,创建对象发生在表单验证之后,我想要的只是之前做的事情,标题对象应该在验证之前创建,

非常感谢您的帮助

相关问题