django - Django - 表单 - 自动填充和隐藏外键字段
问题描述
我有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)
解决方案
您可以使用 exclude 从表单中隐藏字段
Class BHA_overall_Form(forms.ModelForm):
class Meta():
model = BHA_overall
fields = '__all__'
exclude = ('bha_number',)
要在检查表单是否有效后自动填写,只需使用清理数据form = form.cleaned_data
并将其存储在任何变量中即可。它不过是一本字典。您可以使用 form.save() 为其赋值form['bha_number'] = your value
并将其保存到数据库中。
或者您可以使用object = form.save(commit=False)
,因为此方法将返回一个对象。然后你可以做object.bha_number = your number
最后反对。保存在下一行。就这样。选择您喜欢的任何解决方案。
推荐阅读
- java - Java 8 double for 循环流过滤器映射
- docker - .net core - 通过 yaml 转换 app.settings 数组
- selenium-ide - Power Automate UI 流输出失败
- javascript - 5秒后是否可以删除某个频道中的消息?
- django - 如何在Django中检查框过滤器?
- python - 如何返回包含多个列表的列表?
- php - PhpSpreadsheet - 升级到 PHP 7.4.6 - 现在设置公式会导致“尝试访问 null 类型值的数组偏移量”异常
- javascript - Typescript:作为两个接口之一的函数参数
- python - How to modify spacy tokenizer to split URLs into individual words
- python - 将按年排序的数据框更改为按季排序的数据框