Django-表单-自动填充并隐藏外键字段

时间:2018-07-26 21:01:59

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

我有 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模型实例,如下所示:

enter image description here

在这里,我想从用户端删除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>

它呈现了这个:

enter image description here

我希望第一个字段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)

2 个答案:

答案 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中排除?这样,用户不会将其视为一个选项,但该值仍将与表单一起发送。