我有 models.py 和 forms.py ,如下所示:
class BHA_overall(models.Model):
bha_number = models.ForeignKey(BHA_List, 'CASCADE', related_name='bha_overall')
drill_str_name = models.CharField(max_length=111)
depth_in = models.CharField(max_length=111)
depth_out = models.CharField(max_length=111)
class BHA_overall_Form(forms.ModelForm):
class Meta():
model = BHA_overall
fields = '__all__'
在我的模板中,如果我只是使用:
<form method="POST">
{% csrf_token %}
{{ form.as_p }}
<button name='action' value='login' type="submit">Sign in</button>
</form>
外键字段bha_number
显示为组合框,在这里我可以选择它所属的特定bha_number
模型实例,如下所示:
在这里,我想从用户端删除Bha number
字段,然后让我的代码自动为用户填充该字段并隐藏它。因此,从用户方面来看,只会显示3个字段。我该怎么办?
当前,我正在实现以下html代码:
<form id="demo-form" data-parsley-validate="" novalidate="" method="POST">
<div class="row">
{% csrf_token %}
{% for field in form %}
<div class="col-lg-2 col-md-2 col-sm-4 col-xs-6" style="margin-bottom: 5px">
<label class="input-upper-title">{{ field.name }}</label>
<input type="text" id="" class="form-control input-field-height-vertical" name="" data-parsley-trigger="" required="">
</div>
{% endfor %}
<input type="submit" class='btn btn-primary' value="Submit">
</div>
</form>
它呈现了这个:
我希望第一个字段bha_number
从用户端消失,但是系统仍然需要获取该信息以保存到正确的模型实例。因此,我正在寻找一种自动填充 forms.py 或 views.py 级别的ForeignKey
字段的方法。
这是我的 views.py :
class BHA_UpdateView(UpdateView):
model = BHA_List
success_url = reverse_lazy('well_list') # this is wrong
form_class = BHA_overall_Form
def post(self, request, **kwargs):
api = get_well_api(self.request)
current_bha = BHA_List.objects.filter(id=get_current_bha_id(self.request))[0]
form = BHA_overall_Form(request.POST, instance=BHA_overall.objects.filter(bha_number__well__api=api, bha_number=current_bha)[0])
if form.is_valid():
form.save()
return super().post(request, **kwargs)
答案 0 :(得分:3)
您可以使用排除从表单中隐藏字段
Class BHA_overall_Form(forms.ModelForm):
class Meta():
model = BHA_overall
fields = '__all__'
exclude = ('bha_number',)
要在检查表单是否有效后自动填充,只需使用form = form.cleaned_data
清除数据并将其存储在任何变量中即可。只是字典而已。您可以像form['bha_number'] = your value
这样分配值,并使用form.save()将其保存到数据库中。
或者,您可以使用object = form.save(commit=False)
,因为此方法将返回一个对象。然后,您可以object.bha_number = your number
最后反对。保存在下一行。就这样。选择您喜欢的任何解决方案。
答案 1 :(得分:0)
为什么不按原样保留它在form.py上,却将其从HTML中排除?这样,用户不会将其视为一个选项,但该值仍将与表单一起发送。