Изменить поля формы 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()но я не уверен, что это защитит метод сохранения на посту.
надеюсь, что это помогает.
во-первых, если вы не хотите, чтобы пользователь изменял данные, то кажется более чистым просто исключить поле. Включение его в качестве скрытого поля просто добавляет больше данных для отправки по проводу и предлагает злоумышленнику изменить его, когда вы этого не хотите. Если у вас есть веская причина включить поле, но скрыть его, вы можете передать ключевое слово 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)затем, когда вы переопределите его в новом классе, он сохранит свое место.
для нормальной формы вы можете сделать
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()
Comments