Django使用一个表单创建模型的多个实例

Django使用一个表单创建模型的多个实例,django,python-3.x,django-models,django-forms,django-views,Django,Python 3.x,Django Models,Django Forms,Django Views,在django项目中,我想用一个表单保存多个modal实例,为了更好地理解,我有一个模型: class Book(models.Model): author = models.CharField(max_length=100) title = models.CharField(max_length=100) languages = models.ManyToManyField(Languages, related_name='book_language') pri

在django项目中,我想用一个表单保存多个modal实例,为了更好地理解,我有一个模型:

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__'
如果定价类型='single\u pricing',则不执行任何操作,只保存一个模型,但如果定价类型的值='multi\u pricing'

然后,我会收到字典中不同语言的不同定价,例如-

多元定价={英语:400,印地语:300,法语:500}

我想要的是创建三个Book实例,并根据它们的价格设置三种语言

我不想使用create方法。当用户选择单一定价时,应用所有验证的最佳和最方便的方式和方法是什么

由于我重写了我的form\u valid,所以我希望以这样一种方式保存模型,即在保存之前,它要经过form\u valid和clean方法

如果我可以在url中发布表单,如果pricing_type=‘multi_pricing’,每种语言的price和pricing_type=‘single_pricing’?

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不能发生在图书实例化中。参考文档。希望这是有用的。

我认为这个代码片段可以很好地工作。将其放置在您的views.py中


为什么不想使用create方法呢?因为我在视图中重写了我的form\u valid方法,这是一个简单的示例,但在我的项目中,我有26个字段,所以希望在保存每个模型时使用form\u valid和clean方法谢谢,但正如我已经提到的,在保存实例之前,它应该通过form\u valid和clean方法。我有一些自定义的数据附加条件,格式是有效的,否则我对create方法没有任何问题。你很可能会进行条件检查,看看表单是否有效,对吗?默认情况下,这将调用clean。因此,在Conditional之外,创建您的Book实例。在你的条件中,保存它。我开始不明白你的问题是什么,尤其是没有views.py/forms.py中的足够代码,这是问题的主要来源。谢谢,但是关于form\u valid,我用它向模型添加了一些数据,这是一个真实的例子,我有26个字段,所以我不能这样做。
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()