Tomado de mi respuesta a:
Cómo marcar campos de formulario con <div class = 'field_type'> en Django
class MyForm(forms.Form):
myfield = forms.CharField(widget=forms.TextInput(attrs={'class' : 'myfieldclass'}))
o
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['myfield'].widget.attrs.update({'class' : 'myfieldclass'})
o
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
widgets = {
'myfield': forms.TextInput(attrs={'class': 'myfieldclass'}),
}
--- EDITAR ---
Lo anterior es el cambio más fácil de realizar en el código de la pregunta original que cumple con lo que se solicitó. También evita que se repita si reutiliza el formulario en otros lugares; sus clases u otros atributos simplemente funcionan si utiliza los métodos de formulario as_table / as_ul / as_p de Django. Si necesita control total para una representación completamente personalizada, esto está claramente documentado
- EDITAR 2 --- Se
agregó una nueva forma de especificar widget y atributos para un ModelForm.
id
. En segundo lugar, suele ser la responsabilidad del lado de la plantilla hacer exactamente esto, especialmente si va a acceder a esta clase a través de métodos frontend (js, css). No dije que tu respuesta es incorrecta. En mi opinión, es una mala práctica (especialmente cuando trabajas en un equipo con desarrolladores frontend y backend).Esto se puede hacer usando un filtro de plantilla personalizado. Considere presentar su formulario de esta manera:
form.subject
es una instancia de laBoundField
cual tiene elas_widget()
métodoPuede crear un filtro personalizado
addclass
en my_app / templatetags / myfilters.py :Y luego aplique su filtro:
form.subjects
luego se representará con laMyClass
clase CSS.fuente
{{ form.subject|addclass:'myclass1 myclass2' }}
Si no desea agregar ningún código al formulario (como se menciona en los comentarios a la respuesta de @ shadfc), ciertamente es posible, aquí hay dos opciones.
Primero, solo hace referencia a los campos individualmente en el HTML, en lugar de todo el formulario a la vez:
(Tenga en cuenta que también lo cambié a una lista sin ordenar ).
En segundo lugar, tenga en cuenta en los documentos sobre la salida de formularios como HTML , Django:
Todos sus campos de formulario ya tienen una identificación única . Por lo tanto, debe hacer referencia a id_subject en su archivo CSS para diseñar el campo de asunto . Debo señalar que así es como se comporta el formulario cuando toma el HTML predeterminado , lo que requiere simplemente imprimir el formulario, no los campos individuales:
Consulte el enlace anterior para ver otras opciones al generar formularios (puede hacer tablas, etc.).
Nota: Me doy cuenta de que esto no es lo mismo que agregar una clase a cada elemento (si agregó un campo al Formulario, también necesitaría actualizar el CSS), pero es bastante fácil hacer referencia a todos los campos por ID en tu CSS así:
fuente
Según esta publicación de blog, puede agregar clases css a sus campos utilizando un filtro de plantilla personalizado.
fuente
Puedes hacer así:
Espero que funcione.
Ignas
fuente
Puede usar esta biblioteca: https://pypi.python.org/pypi/django-widget-tweaks
Le permite hacer lo siguiente:
fuente
render_field
.Tu puedes hacer:
Luego puede agregar clases / id a, por ejemplo, la
<td>
etiqueta. Por supuesto, puede usar cualquier otra etiqueta que desee. Marque Trabajar con formularios de Django como ejemplo de lo que está disponible para cada unofield
en el formulario ({{field}}
por ejemplo, solo está generando la etiqueta de entrada, no la etiqueta, etc.).fuente
Una solución es usar JavaScript para agregar las clases CSS necesarias una vez que la página esté lista. Por ejemplo, estilo de salida de formulario django con clases bootstrap (jQuery se usa por brevedad):
Esto evita la fealdad de mezclar detalles de estilo con la lógica de su negocio.
fuente
Escribe tu formulario como:
En su campo HTML, haga algo como:
Luego, en su CSS, escriba algo como:
¡Espero que valga la pena probar esta respuesta! Tenga en cuenta que debe haber escrito sus vistas para representar el archivo HTML que contiene el formulario.
fuente
Es posible que no necesite anular su clase de formulario '
__init__
, porque Django establecename
yid
atributos en los HTMLinput
. Puedes tener CSS como este:fuente
id
campo creado por Django para formsets pone muy peluda ...No vi este realmente ...
https://docs.djangoproject.com/en/1.8/ref/forms/api/#more-granular-output
Salida más granular
Los métodos as_p (), as_ul () y as_table () son simplemente atajos para desarrolladores perezosos: no son la única forma en que se puede mostrar un objeto de formulario.
clase BoundField Se usa para mostrar HTML o acceder a atributos para un solo campo de una instancia de Form.
El método str () ( unicode en Python 2) de este objeto muestra el HTML para este campo.
Para recuperar un único BoundField, use la sintaxis de búsqueda del diccionario en su formulario usando el nombre del campo como clave:
Para recuperar todos los objetos BoundField, itere el formulario:
La salida específica del campo respeta la configuración auto_id del objeto de formulario:
fuente
Hay una herramienta muy fácil de instalar y excelente hecha para Django que utilizo para diseñar y se puede usar para todos los marcos frontend como Bootstrap, Materialise, Foundation, etc. Se llama widget-tweaks Documentation: Widget Tweaks
de los formularios de importación de django
En lugar de usar el predeterminado:
Puede editarlo a su manera utilizando el atributo render_field que le brinda una forma más html de diseñarlo como en este ejemplo:
template.html
Esta biblioteca le brinda la oportunidad de separar bien su front-end de su backend
fuente
En Django 1.10 (posiblemente también antes) puede hacerlo de la siguiente manera.
Modelo:
Formar:
Modelo:
fuente
Editar: Otra forma (ligeramente mejor) de hacer lo que sugiero se responde aquí: estilo de campo de entrada de formulario Django
Todas las opciones anteriores son increíbles, solo pensé en agregar esta porque es diferente.
Si desea un estilo personalizado, clases, etc. en sus formularios, puede hacer una entrada html en su plantilla que coincida con su campo de formulario. Para un CharField, por ejemplo, (el widget predeterminado es
TextInput
), supongamos que desea una entrada de texto con aspecto de bootstrap. Harías algo como esto:<input type="text" class="form-control" name="form_field_name_here">
Y siempre y cuando se pone el nombre de campo de formulario coincide con el html
name
attribue, (y probablemente el widget debe coincidir con el tipo de entrada también) Django ejecutará todos los validadores mismos en ese campo cuando se ejecutavalidate
oform.is_valid()
yDiseñar otras cosas como etiquetas, mensajes de error y texto de ayuda no requiere mucha solución porque puedes hacer algo así
form.field.error.as_text
y estilizarlos como quieras. Los campos reales son los que requieren un poco de violín.No sé si esta es la mejor manera, o la forma en que recomendaría, pero es una forma, y podría ser adecuada para alguien.
Aquí hay un tutorial útil de formularios de estilo e incluye la mayoría de las respuestas enumeradas en SO (como usar el atributo attr en los widgets y ajustes de widgets). https://simpleisbetterthancomplex.com/article/2017/08/19/how-to-render-django-form-manually.html
fuente
Instancias de widget de estilo
Si desea que una instancia de widget se vea diferente de otra, deberá especificar atributos adicionales en el momento en que el objeto de widget se instancia y se asigna a un campo de formulario (y quizás agregue algunas reglas a sus archivos CSS).
https://docs.djangoproject.com/en/2.2/ref/forms/widgets/
Para hacer esto, utiliza el argumento Widget.attrs al crear el widget:
También puede modificar un widget en la definición del formulario:
O si el campo no se declara directamente en el formulario (como los campos de formulario de modelo), puede usar el atributo Form.fields:
Django incluirá los atributos adicionales en la salida representada:
fuente