2012-04-12 76 views
2

我想在Django中使用ModelForms将内容添加到我的数据库,其中包括ManyToManyField。这里是我的模型的相关部分:Django:ManyToManyField,添加对象,如果它不存在

class Category(models.Model): 
    name = models.CharField(max_length=100) 
    description = models.TextField() 

    def __unicode__(self): 
     return self.name 

class Recipe(models.Model): 
    title = models.CharField(max_length=100) 
    body = models.TextField() 
    user = models.ForeignKey(User) 
    image = models.ImageField(upload_to='images/recipethumbs/', null = True, blank=True) 
    ingredients = models.ManyToManyField(Ingredient, through="IngredientMap") 
    categories = models.ManyToManyField(Category) 
    citation = models.CharField(max_length=200) 

    def __unicode__(self): 

默认情况下,ManyToManyFields是通过选择题的选择表示。这允许用户从类别对象中预先存在的字段中选择。我想改变这一点,以便用户可以选择类别,如果他们目前存在,或者添加新的类别,如果他们不存在。看起来,这可以通过将小部件更改为TextInput来完成。

class RecipeForm(ModelForm): 
    class Meta: 
     model = Recipe 
     widgets = { 
      'categories': TextInput(attrs={'size': 40,}), 
      'ingredients': Textarea, 
     } 

但是,如果用户输入当前不存在的类别表中的类别,然后Django的抱怨,我需要“输入值列表”。如何将添加到如果它尚不存在的新类别?

我在自定义.save()作为Ilvar解决方案建议:

categories = re.findall(r'\w+[\w\s]+', self.cleaned_data.get('categories')) #returns an array 

     if commit: 
      m.save() 

     # You can only assign m2m if the Recipe object has been saved. 
     for category in categories: 
      try: 
       category_in_db = Category.objects.get(name=category) 
      except: 
       category_in_db = None 
      if category_in_db: 
       m.categories.add(category_in_db) 
      else: 
       m.categories.create(name=category) 

     return m 
+0

在这种情况下,您希望django知道如何处理来自文本输入的数据?您的类别模型有一个必需的描述字段,因此即使使用自定义小部件,此问题实际上也是无法解决的。 – Greg 2012-04-12 00:53:43

+1

我不指望它知道如何处理它。我想告诉它该怎么做,如果我有一些想法... – bento 2012-04-12 01:01:02

回答

1

您从您的形式需要exclude M2M领域,并添加一个CharField手动形成类本身。然后覆盖__init__initialsave中设置此字段。在save你可以做任何你想要的文字cleaned_data。我想,在你的情况下,它将通过逗号分割,为每个值获得一个类别,并且在返回结果之前保存父表单an后,将对象中的分类列表分配给对象中的字段。也许还需要添加一些autocomplete以避免在客户端输入错误。

+0

啊,我明白了。这就说得通了。谢谢ilvar。 – bento 2012-04-12 04:31:38

相关问题