Change the width of form elements created with ModelForm in Django

后端 未结 4 1617
醉话见心
醉话见心 2020-12-22 19:13

How can I change the width of a textarea form element if I used ModelForm to create it?

Here is my product class:

class ProductForm(ModelForm):
    l         


        
4条回答
  •  醉话见心
    2020-12-22 19:43

    The easiest way for your use case is to use CSS. It's a language meant for defining presentation. Look at the code generated by form, take note of the ids for fields that interest you, and change appearance of these fields through CSS.

    Example for long_desc field in your ProductForm (when your form does not have a custom prefix):

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

    Second approach is to pass the attrs keyword to your widget constructor.

    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
    

    It's described in Django documentation.

    Third approach is to leave the nice declarative interface of newforms for a while and set your widget attributes in custom constructor.

    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
    

    This approach has the following advantages:

    • You can define widget attributes for fields that are generated automatically from your model without redefining whole fields.
    • It doesn't depend on the prefix of your form.

提交回复
热议问题