Изменение поля формы django на скрытое поле

у меня есть форма django с RegexField (что очень похоже на обычное поле ввода текста). На мой взгляд, при определенных условиях я хочу скрыть это от пользователя, и пытается сохранить форму как можно более похожими.

каков наилучший способ превратить это поле в HiddenInput поле? Я знаю, что могу установить атрибуты на поле с помощью form['fieldname'].field.widget.attr['readonly'] = 'readonly', и я могу установить желаемое начальное значение с form.initial['fieldname'] = 'mydesiredvalue'. Однако это не изменит форму виджета.

что лучший / самый django-y / наименее хакерский способ сделать это поле <input type="hidden" поле?

5 ответов


Если у вас есть пользовательский шаблон и посмотреть можно исключить поле и использовать {{ modelform.instance.field }} чтобы получить значение.

также можно использовать в вид:

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

но я не уверен, что он защитит метод сохранения на post.

надеюсь, что это помогает.


это также может быть полезно:{{ 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)

Я предпочитаю этот подход к изменению внутренних элементов модели в представлении, но это вопрос вкуса.


параметр, который работал для меня, определяет поле в исходной форме как:

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

затем, когда вы переопределите его в новом классе, он сохранит его место.


для нормальной формы вы можете сделать

class MyModelForm(forms.ModelForm):
    slug = forms.CharField(widget=forms.HiddenInput())

если у вас есть форма модели, вы можете сделать следующее

class MyModelForm(forms.ModelForm):
    class Meta:
        model = TagStatus
        fields = ('slug', 'ext')
        widgets = {'slug': forms.HiddenInput()}

вы также можете переопределить __init__ метод

class Myform(forms.Form):
    def __init__(self, *args, **kwargs):
        super(Myform, self).__init__(*args, **kwargs)
        self.fields['slug'].widget = forms.HiddenInput()