在我的django项目中,我想用一种形式保存模态的多个实例,为了更好地理解,我有模型:
class Book(models.Model):
author = models.CharField(max_length=100)
title = models.CharField(max_length=100)
languages = models.ManyToManyField(Languages, related_name='book_language')
price = models.DecimalField(max_digits=5)
以我的形式
class BookForm(forms.ModelForm):
multi_pricing = forms.CharField(widget=forms.HiddenInput())
pricing_type = forms.CharField(widget=forms.HiddenInput())
class Meta:
model = Book
fields = '__all__'
如果pricing_type = 'single_pricing'
,则不执行任何操作,仅保存一个模型,但是如果值为pricing_type = 'multi_pricing'
然后我针对字典中的不同语言收到不同的价格,例如-
multi_pricing = {"English":"400","Hindi":"300","French":"500"}
。
我想要的是创建Book的三个实例,并根据其价格设置三种语言。
我不想使用create
方法。像用户选择single_pricing
一样应用所有验证的最佳,最便捷的方法和方法是什么?
当我覆盖form_valid
时,我想保存模型,使其在保存之前通过form_valid
和clean
方法。
如果每种语言的价格分别为pricing_type = 'multi_pricing'
和pricing_type = 'single_pricing'
,我可以在网址中发布表单怎么办?
答案 0 :(得分:0)
create
方法创建模型的实例,并将其保存到数据库中。您可以避免使用create
方法,但是如果要将对象保存到数据库中,则需要手动调用save()
。
例如:
# 1: create instance
book_one = Book(author="Name", title="Cool Book", price=10)
# 2: save if you want to store it in the database
book_one.save()
# 3: add language object that has already been created
book_one.add(some_language_obj)
请记住,根据M2M字段的规则,步骤3不能在Book实例化中发生。参考文档here。希望这是有用的。
答案 1 :(得分:0)
我认为此代码片段可以正常工作。将其放在您的 views.py
中if request.method =='POST':
form = BookForm(request.POST)
if form.is_valid():
pricing_type =form.cleaned_data['pricing_type']
if pricing_type=="single_pricing":
book_object=Book()
book_object.author=form.cleaned_data["author"]
book_object.title=form.cleaned_data["title"]
book_object.languages=form.cleaned_data["languages"]
book_object.price=form.cleaned_data["price"]
book_object.save()
elif pricing_type=="multi_pricing":
multi_pricing=form.cleaned_data['multi_pricing']
for each in multi_pricing.keys():
book_object=Book()
book_object.author=form.cleaned_data["author"]
book_object.title=form.cleaned_data["title"]
book_object.languages=each
book_object.price=multi_pricing[each]
book_object.save()