如何在Django ModelForm中隐藏字段?

11 投票
2 回答
15673 浏览
提问于 2025-04-17 23:38

举个例子:

class TestModel(models.Model):
    ref1 = models.ForeignKey(RefModel)
    text1 = models.TextField()

class TestModelForm(ModelForm):
    class Meta:
        model = TestModel
        fields = ('text1')

我只允许用户输入text1这个字段,但当我重新定义我的视图中的post方法时,我还想设置ref1的值,我该怎么做呢?

我希望能让TestModelForm有ref1这个字段,但不让用户修改它。这样我就可以在post方法中修改request.POST的值,然后把它传给TestModelForm,这样可以吗?

2 个回答

0

注意:我使用的是(Django 3.2)

我尝试添加一个小工具,但没有成功。不过我找到了一种更简单的方法,没有使用小工具就解决了问题。

class TestModelForm(ModelForm):
    ref1 = forms.CharField (widget = forms.Textarea(
        attrs = {
            'hidden': '',
        }
    ))

希望这对你或其他人有帮助;)

19

你可以把 HiddenInput 当作 ref1 小部件来使用:

class TestModelForm(ModelForm):
    class Meta:
        model = TestModel
        widgets = {
            'ref1': forms.HiddenInput(),
        }

另一种选择是保存表单时把 commit 参数设置为 False。这样你就可以只在表单中包含可见的字段,然后再用需要的数据更新模型实例:

def some_view(request):
    # ...
    if request.method == 'POST':
        form = TestModelForm(request.POST)
        if form.is_valid():
            instance = form.save(commit=False)
            ref = get_ref_according_to_url()
            instance.ref1 = ref
            instance.save()
            # ...

撰写回答