gpt4 book ai didi

Django:ManyToManyField,如果不存在则添加对象

转载 作者:行者123 更新时间:2023-12-03 18:36:21 26 4
gpt4 key购买 nike

我正在尝试在 Django 中使用 ModelForms 将内容添加到我的数据库中,其中包括一个 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,
}

但是,如果用户输入的类别当前不存在于 Categories 表中,那么 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

最佳答案

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

关于Django:ManyToManyField,如果不存在则添加对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10115984/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com