【问题标题】:Django - multiple models in one pageDjango - 一页中有多个模型
【发布时间】:2018-07-25 21:38:03
【问题描述】:

我有一个看起来像这样的模型:

models.py

class BHA_List(models.Model):
    well = models.ForeignKey(WellInfo, 'CASCADE', related_name='bha_list')
    bha_number = models.CharField(max_length=100)

class BHA_Drill_Bit(models.Model):
    bha_number = models.ForeignKey(BHA_List, 'CASCADE', related_name='bha_drill_bit')
    bit_type = models.CharField(max_length=111)  

class BHA_overall(models.Model):
    bha_number = models.ForeignKey(BHA_List, 'CASCADE', related_name='bha_overall')
    drill_str_name = models.CharField(max_length=111)

class BHA_Motor(models.Model):
    bha_number = models.ForeignKey(BHA_List, 'CASCADE', related_name='bha_drill_bit')
    motor_type = models.CharField(max_length=111)

BHA_List为父模型,其余为ForeignKey关联的子模型。截图是我要创建的页面

所以,我想使用model = BHA_List 中的一个实例生成一个基本页面。在此页面中,我想通过ForeignKey 关系编辑与BHA_List 相关的模型实例。

我目前有一个看起来像这样的视图,但它是错误的:

class BHA_UpdateView(UpdateView):
    model = BHA_List
    pk_url_kwarg = 'pk_alt'
    form_class = BHA_overall_Form

通过设置model = BHA_List,我能够获得BHA_List 中的一个实例,并从中生成url。现在我的views 正确返回BHA_List 中的一个实例:BHA 1

我试图通过设置form_class = BHA_overall_Form 来编辑子模型。但这并没有做任何事情,尽管它在用户端显示了表单字段。编辑并单击Submit 按钮后,更改不会保存在数据库中。有人指出这是因为我在UpdateView中的模型和form不匹配,因为我设置了model = BHA_List,而是form_class = BHA_overall_form。

我该如何解决这个问题?其他人也指出使用多个视图,但我真的不知道该怎么做,因为我对 Django 很陌生。任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案1】:

    只是为了让你知道。如果要更新一个表中的单行,可以使用 UpdateView。当您设置 model = BHA_LIST 时,您说的是 Django。嘿,Django,我想更新这个模型,所以用这个表中的字段为我呈现一个表单。您可以通过在模型上设置字段 attr 或使用像您所做的那样自定义显示哪些字段的表单来做到这一点。现在允许设置我们自己的表单的好处是。虽然我们创建了一个 modelForm,但我们也可以在其中添加额外的字段。现在,您的 BHAOverallForm 应该如下所示,以容纳您需要的所有字段。

    forms.py

    class BHAOverallForm(forms.ModelForm):
        well = models.ForeignKey(WellInfo, 'CASCADE', related_name='bha_list')
        bha_number = models.CharField(max_length=100)
        bit_type = models.CharField(max_length=111
        drill_str_name = models.CharField(max_length=111)
        motor_type = models.CharField(max_length=111)
    
        class Meta:
            model = BHAList
    

    您可以像现在一样在表单中使用此表单。您还可以添加 clean_field 以添加验证。现在进入更新部分。您的视图应如下所示

    views.py

    class BHAUpdateView(UpdateView):
        model = BHAList
        form_class = BHAOverallForm
    
        def form_valid(self, form):
            super(BHAUpdateView, self).form_valid(form) # save BHAList to the DB
            bha_list = form.instance
            bha_drill_bit = bha_list.bhadrillbit_set.first() # assuming you have only one drill_bit per list, if you need more modify your question accordingly.
            bha_drill_bit.bit_type = form.cleaned_data.get("bit_type)
            bha_drill_bit.save()
    
            # you can do the same for other models as well.
    

    【讨论】:

      猜你喜欢
      • 2017-08-07
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多