Django-表格-自动填写&;隐藏外键字段

Django-表格-自动填写&;隐藏外键字段,django,django-models,django-forms,django-views,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)

我有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
从用户端消失,但系统仍需要获取该信息以保存到正确的模型实例。因此,我正在寻找一种方法,在forms.pyviews.py级别自动填充此
ForeignKey
字段

这是我的视图。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)

可以使用“排除”从窗体中隐藏字段

Class BHA_overall_Form(forms.ModelForm):
    class Meta():
        model = BHA_overall
        fields = '__all__'
        exclude = ('bha_number',) 
要在检查表单是否有效后自动填充,只需使用
form=form.cleaned_data
清理数据并将其存储在任何变量中即可。它只是一本字典。您可以像
表单['bha_number']=您的值那样为其赋值,并使用form.save()将其保存到数据库中。
或者您可以使用
object=form.save(commit=False)
,因为此方法将返回一个对象。然后你可以做
object.bha_number=你的号码

最后是反对。保存在下一行。这就是全部。选择您喜欢的任何解决方案。

您可以使用“排除”从表单中隐藏字段

Class BHA_overall_Form(forms.ModelForm):
    class Meta():
        model = BHA_overall
        fields = '__all__'
        exclude = ('bha_number',) 
要在检查表单是否有效后自动填充,只需使用
form=form.cleaned_data
清理数据并将其存储在任何变量中即可。它只是一本字典。您可以像
表单['bha_number']=您的值那样为其赋值,并使用form.save()将其保存到数据库中。
或者您可以使用
object=form.save(commit=False)
,因为此方法将返回一个对象。然后你可以做
object.bha_number=你的号码

最后是反对。保存在下一行。这就是全部。选择您喜欢的任何解决方案。

为什么不保留forms.py上的解决方案,但将其从HTML中排除?这样,用户不会将其视为选项,但值仍将与表单一起发送。

为什么不将其保留在forms.py上,但将其从HTML中排除?这样,用户将不会将其视为选项,但值仍将与表单一起发送。

自动填充foreignkey字段如何在这种情况下,如果设置了包含外键的唯一约束,则表单验证可能无效。如何克服这个问题?自动填充外键字段如何?在这种情况下,如果设置了包含外键的唯一约束,则表单验证可能无效。如何克服这一点?