【问题标题】:How to override createView to save multiple data entry如何覆盖 createView 以保存多个数据条目
【发布时间】:2014-07-21 11:51:01
【问题描述】:

使用 CreateView 类,我想保存多个数据条目。
示例输入:

    项目是“苹果、香蕉、胡萝卜”
位置是“位置 1”

我想像这样将它们保存到数据库中:
[苹果,位置 1]
[香蕉,位置 1]
[胡萝卜,位置 1]

#model.py
class Inventory(models.Model):
    item = models.CharField(max_length=14)
    location = models.CharField(max_length=10)

#forms.py
class InventoryCreateForm(forms.ModelForm):
    item = forms.CharField(widget=forms.Textarea(attrs={'rows': 8,                                                      
                                                       'cols': 14}))
    class Meta:
        model = Inventory

#views.py
class InventoryCreateView(CreateView):
    model = Inventory
    form_class = InventoryCreateForm

谢谢

【问题讨论】:

  • 为什么要强迫自己使用CreateView?尽可能不要使用它来代替 FBV。只需使用功能视图。此外,在您的情况下,django-taggit 似乎对管理项目很有用。
  • 感谢您的回复,我已经在使用 FBV 进行此实现,并且正在尝试探索 GCBV,这就是我尝试使用 createView 的原因。

标签: python django forms django-views django-generic-views


【解决方案1】:

您需要覆盖 createview 使用的“form_valid()”方法。

然后你需要读入表单数据

def form_valid(self,form):
    self.object = form.save(commit=False)
    foo = self.object.bar #your data is in the object

然后因为您使用的是文本字段,所以您需要以某种方式拆分传递到表单的数据并循环遍历这些值。理想情况下,您需要一个项目列表 ['apple', 'banana', 'pear'] 然后从列表中取出位置并将其存储到一个变量中,以便以后在 location_variable 上使用。

一旦您拥有所需形式的数据,您就需要实例化 Inventory 模型

from foo.models import Inventory #import at the top of your file  

for item is list:
    inventory = Inventory()
    inventory.item = item
    inventory.location = location_variable
    inventory.save()

我希望这个答案可以在某种程度上对您有所帮助,如果您想了解有关基于类的视图的更多详细信息,请访问ccbv,其中列出了每个视图的所有信息。

否则你可以在 django Form docs 中寻找更合适的形式来使用。

【讨论】:

    猜你喜欢
    • 2020-08-21
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    相关资源
    最近更新 更多