Django-一页中包含多个模型

时间:2018-07-25 21:38:04

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

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

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相关的子模型。屏幕截图是我要创建的页面

enter image description here

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

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

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按钮后,所做的更改不会保存在DB中。有人指出,这是因为在我设置UpdateView时,model = BHA_List和形式中的模型不匹配,而是form_class = BHA_overall_form

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

1 个答案:

答案 0 :(得分:2)

只是为了让您知道。如果要更新一个表中的一行,可以使用UpdateView。当您将模型设置为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.
相关问题