問題描述

我有一個帶有 RegexField(與普通文字輸入欄位非常相似) 的 django 表單。在我看來,在某些情況下,我想把它從使用者隱藏起來,並儘量保持形式儘可能相似。

將該欄位轉換為 HiddenInput 欄位的最佳方式是什麼?我知道我可以使用 form['fieldname'].field.widget.attr['readonly'] = 'readonly'在欄位上設定屬性,並且可以使用 form.initial['fieldname'] = 'mydesiredvalue'設定所需的初始值。但是,這不會改變視窗小工具的形式。

什麼是最好的/大多數 django-y /最簡便的方式使這個領域成為一個<input type="hidden"領域?

最佳解決方案

如果您有自定義模板和檢視,則可以排除該欄位並使用 {{ modelform.instance.field }}獲取該值。

您也可以更喜歡在檢視中使用:

form.fields['field_name'].widget = forms.HiddenInput()

但我不知道它會保護郵件的儲存方法。

希望它有幫助。

次佳解決方案

它也可以是有用的:{{ form.field.as_hidden }}

第三種解決方案

首先,如果您不希望使用者修改資料,那麼簡單地排除該欄位似乎更為簡潔。將其作為隱藏欄位,只需新增更多資料透過電子郵件傳送,並在不想要的時候邀請惡意使用者進行修改。如果你有一個很好的理由來包含該欄位但是隱藏它,你可以將一個關鍵字 arg 傳遞給 modelform 的建構函式。可能這樣的事情

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
    def __init__(self, *args, **kwargs):
        from django.forms.widgets import HiddenInput
        hide_condition = kwargs.pop('hide_condition',None)
        super(MyModelForm, self).__init__(*args, **kwargs)
        if hide_condition:
            self.fields['fieldname'].widget = HiddenInput()
            # or alternately:  del self.fields['fieldname']  to remove it from the form altogether.

然後在你的看法:

form = MyModelForm(hide_condition=True)

我更喜歡這種在檢視中修改 modelform 內部的方法,但這是一個口味問題。

第四種方案

一個對我有用的選項,將原始形式的欄位定義為:

forms.CharField(widget = forms.HiddenInput(), required = False)

那麼當你在新的類中覆蓋它時,它將保持它的位置。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇