Django用一种形式创建模型的多个实例

时间:2018-07-21 19:31:29

标签: django python-3.x django-models django-forms django-views

在我的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_validclean方法。

如果每种语言的价格分别为pricing_type = 'multi_pricing'pricing_type = 'single_pricing',我可以在网址中发布表单怎么办?

2 个答案:

答案 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()