Cambiar el ancho de los elementos de formulario creados con ModelForm en Django


¿Cómo puedo cambiar el ancho de un elemento de formulario textarea si usé ModelForm para crearlo?

Aquí está mi clase de producto:

class ProductForm(ModelForm):
    long_desc = forms.CharField(widget=forms.Textarea)
    short_desc = forms.CharField(widget=forms.Textarea)
    class Meta:
        model = Product

Y el código de la plantilla...

{% for f in form %}
    {{ f.name }}:{{ f }}
{% endfor %}

f es el elemento de formulario...

Author: Vini.g.fer, 2008-09-21

4 answers

La forma más fácil para su caso de uso es usar CSS . Es un lenguaje para definir la presentación. Mire el código generado por el formulario, tome nota de los ID de los campos que le interesan y cambie la apariencia de estos campos a través de CSS.

Ejemplo para el campo long_desc en su formulario de producto (cuando su formulario no tiene un prefijo personalizado):

#id_long_desc {
    width: 300px;
    height: 200px;
}

El segundo enfoque es pasar la palabra clave attrs a tu constructor de widget.

class ProductForm(ModelForm):
    long_desc = forms.CharField(widget=forms.Textarea(attrs={'cols': 10, 'rows': 20}))
    short_desc = forms.CharField(widget=forms.Textarea)
    class Meta:
        model = Product

Es descrito en Django documentation .

El tercer enfoque es dejar la bonita interfaz declarativa de newforms por un tiempo y establecer los atributos del widget en constructor personalizado.

class ProductForm(ModelForm):
    long_desc = forms.CharField(widget=forms.Textarea)
    short_desc = forms.CharField(widget=forms.Textarea)
    class Meta:
        model = Product

    # Edit by bryan
    def __init__(self, *args, **kwargs):
        super(ProductForm, self).__init__(*args, **kwargs) # Call to ModelForm constructor
        self.fields['long_desc'].widget.attrs['cols'] = 10
        self.fields['long_desc'].widget.attrs['rows'] = 20

Este enfoque tiene las siguientes ventajas:

  • Puede definir atributos de widget para campos que se generan automáticamente desde su modelo sin redefinir campos enteros.
  • No depende del prefijo de tu formulario.
 104
Author: zuber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-21 17:41:45

Excelente respuesta de zuber, pero creo que hay un error en el código de ejemplo para el tercer enfoque. El constructor debe ser:

def __init__(self, *args, **kwargs):
    super(ProductForm, self).__init__(*args, **kwargs) # Call to ModelForm constructor
    self.fields['long_desc'].widget.attrs['cols'] = 10
    self.fields['long_desc'].widget.attrs['cols'] = 20

Los objetos de campo no tienen atributos 'attrs', pero sus widgets sí.

 15
Author: bryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-12 22:02:52

En el caso de que esté utilizando un complemento como Grappelli que hace un uso intensivo de estilos, puede encontrar que cualquier atributo row y col sobrescritos se ignoran debido a los selectores CSS que actúan en su widget. Esto podría suceder cuando se utiliza el excelente Segundo o tercer enfoque de zuber anterior.

En este caso, simplemente use el Primer Enfoque mezclado con el Segundo o Tercer Enfoque estableciendo un atributo 'style' en lugar de los atributos 'rows' y 'cols'.

Aquí hay un ejemplo modificando init en el Tercer Enfoque anterior:

def __init__(self, *args, **kwargs):
    super(ProductForm, self).__init__(*args, **kwargs) # Call to ModelForm constructor
    self.fields['short_desc'].widget.attrs['style'] = 'width:400px; height:40px;'
    self.fields['long_desc'].widget.attrs['style']  = 'width:800px; height:80px;'
 6
Author: bergdesign,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-07 21:57:37

Establece row y tu clase css en la vista del modelo de administración:

'explicacion': AutosizedTextarea(attrs={'rows': 5, 'class': 'input-xxlarge', 'style': 'width: 99% !important; resize: vertical !important;'}),
 0
Author: Cubiczx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-02 08:36:44