【问题标题】:Django ModelForm Hidden Field to 'True' in only a certain situation?仅在特定情况下 Django ModelForm 隐藏字段为 \'True\'?
【发布时间】:2023-01-28 01:01:07
【问题描述】:

我有以下 Django 表单;它有一个名为“完成”的字段,该字段是隐藏的。我将默认设置为 False 因为只有我希望它设置为 True 的情况。

问题是它仍然将其标记为“False”,我无法弄清楚在那种情况下如何更改它。

在我的views.py 我有这个:

        context["test_form"] = TestForm(
            instance=self.object, hide_status=True, is_finished=True
        )

form 看起来像这样:

class TestForm(ModelForm):
    finished = forms.BooleanField(
        widget=forms.HiddenInput(), initial=False, required=False
    )
    status = forms.Select(attrs={"class": "form-control"})

    def __init__(self, *args, **kwargs):
        hide_status = kwargs.pop("hide_status", None)
        is_finished = kwargs.pop("is_finished", None)
        super().__init__(*args, **kwargs)
        self.fields["status"].queryset = Status.objects.filter(active=True)
        self.fields["status"].widget.attrs["class"] = "form-control"
        if hide_status:
            self.fields["status"].widget = HiddenInput()
        if is_finished:
            self.fields["finished"].initial = True

    class Meta:
        model = Test
        fields = ["finished", "status"]

HTML 非常简单:

<form method="post" action="{% url 'my_app:test-update' %}">
{% csrf_token %}
{{ test_form.as_p }}
<button type="submit" class="btn btn-primary">Finish</button>
</form>

呈现的 HTML 如下所示:

<input type="hidden" name="finished" value="False" id="id_finished">

在这种情况下,将该设置设置为 True 的最佳方法是什么?

【问题讨论】:

    标签: python html django django-forms


    【解决方案1】:

    您可以尝试在呈现表单之前直接在模板中设置隐藏字段的值。这可以通过使用 forms.BooleanField 中的 attrs 属性来为 value 属性设置自定义值来完成。

    在 TestForm 类中,您可以更新 finished 字段以包含 attrs 属性:

    finished = forms.BooleanField(
        widget=forms.HiddenInput(), initial=False, required=False, attrs={'value': 'False'}
    )
    

    然后在视图中,您可以根据 is_finished 变量更新属性的值:

    context["test_form"] = TestForm(
        instance=self.object, hide_status=True, is_finished=True
    )
    

    如果上下文 ["test_form"].is_valid(): context["test_form"].fields['finished'].widget.attrs['value'] = 'True' 最后,在模板中,您可以像往常一样显示表单:

    <form method="post" action="{% url 'my_app:test-update' %}">
        {% csrf_token %}
        {{ test_form.as_p }}
        <button type="submit" class="btn btn-primary">Finish</button>
    </form>
    

    这样,当显示表单时,隐藏字段将具有正确的值,并且当提交表单时,它也将具有正确的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 2017-11-13
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      相关资源
      最近更新 更多