我有一个看起来像这样的模型:
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
中的一个实例生成基本页面。在此页面中,我要通过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的新手。任何帮助将不胜感激。谢谢!
答案 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.