首页 > 解决方案 > Django - 表单 - 自动填充和隐藏外键字段

问题描述

我有models.pyforms.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.pyviews.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)

标签: djangodjango-modelsdjango-formsdjango-views

解决方案


您可以使用 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 最后反对。保存在下一行。就这样。选择您喜欢的任何解决方案。


推荐阅读