it-swarm.com.ru

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

У меня есть форма Django с RegexField, которая очень похожа на обычное поле ввода текста.

На мой взгляд, при определенных условиях я хочу скрыть это от пользователя и стараться сделать форму максимально похожей. Как лучше всего превратить это поле в поле HiddenInput?

Я знаю, что могу установить атрибуты на поле с помощью:

form['fieldname'].field.widget.attr['readonly'] = 'readonly'

И я могу установить желаемое начальное значение с помощью:

form.initial['fieldname'] = 'mydesiredvalue'

Однако это не изменит форму виджета.

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

114
Rory

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

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

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

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

Надеюсь, поможет.

151
christophe31

Это также может быть полезно: {{ form.field.as_hidden }}

172
semente

Во-первых, если вы не хотите, чтобы пользователь изменял данные, тогда кажется более понятным просто исключить поле. Включение его в качестве скрытого поля просто добавляет дополнительные данные для отправки по проводам и предлагает злоумышленнику изменить его, когда вы этого не хотите. Если у вас есть веская причина включить поле, но скрыть его, вы можете передать ключевое слово arg в конструктор модели формы. Возможно, что-то вроде этого:

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)

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

43
rych

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

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

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

41
Shay Rybak

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

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()
16
Anjaneyulu Batta