La meilleure façon pour votre cas d'utilisation est d'utiliser CSS. C'est un langage destiné à définir la présentation. Regardez le code généré par le formulaire, prenez note des identifiants des champs qui vous intéressent et modifiez l'apparence de ces champs via CSS.
Exemple pour le champ long_desc
dans votre ProductForm (lorsque votre formulaire ne dispose pas d'un préfixe personnalisé):
#id_long_desc {
width: 300px;
height: 200px;
}
Deuxième approche est de passer le mot-clé attrs
à votre constructeur 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
C'est described in Django documentation.
Troisième approche est de laisser la belle interface déclarative de nouvelles formes pendant un certain temps et définir vos attributs de widget dans le constructeur personnalisé.
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
Cette approche présente les avantages suivants:
- Vous pouvez définir un widget attributs pour les champs qui sont générés automatiquement à partir de votre modèle sans redéfinir des champs entiers.
- Cela ne dépend pas du préfixe de votre formulaire.
Le second a parfaitement fonctionné –
Option 3 est très utile. Peut-être que l'exemple pourrait également montrer que les champs n'ont pas besoin d'être définis dans le formulaire, mais peut encore remplacer les champs définis dans le modèle qui passent automatiquement. –