widgets update formularios form fields example avanzados python html django django-forms

python - update - post django



Cambiar un campo de formulario django a un campo oculto (5)

En primer lugar, si no desea que el usuario modifique los datos, parece más limpio simplemente excluir el campo. Incluirlo como un campo oculto solo agrega más datos para enviar a través del cable e invita a un usuario malintencionado a modificarlo cuando usted no lo desee. Si tiene una buena razón para incluir el campo pero lo oculta, puede pasar una palabra clave arg al constructor de la forma del modelo. Algo como esto quizás:

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.

Entonces en tu opinión:

form = MyModelForm(hide_condition=True)

Prefiero este enfoque para modificar las partes internas del modelo en la vista, pero es una cuestión de gusto.

Tengo un formulario django con un RegexField (que es muy similar a un campo de entrada de texto normal). En mi opinión, bajo ciertas condiciones quiero ocultar esto al usuario y tratar de mantener el formulario lo más similar posible.

¿Cuál es la mejor manera de convertir este campo en un campo HiddenInput ? Sé que puedo establecer atributos en el campo con form[''fieldname''].field.widget.attr[''readonly''] = ''readonly'' , y puedo establecer el valor inicial deseado con form.initial[''fieldname''] = ''mydesiredvalue'' . Sin embargo, eso no cambiará la forma del widget.

¿Cuál es la mejor / más django-y / o menos hacky forma de hacer de este campo un campo <input type="hidden" ?


Para la forma normal puedes hacer

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

Si tiene un modelo, puede hacer lo siguiente

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

También puede anular el método __init__

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


Si tiene una plantilla y una vista personalizadas, puede excluir el campo y usar {{ modelform.instance.field }} para obtener el valor.

también es posible que prefiera usar en la vista:

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

pero no estoy seguro de que proteja el método save en la publicación.

Espero eso ayude.


También puede ser útil: {{ form.field.as_hidden }}


una opción que funcionó para mí, defina el campo en la forma original como:

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

luego, cuando lo anules en la nueva Clase, mantendrá su lugar.