Django a tendance à remplir un espace horizontal lors de l'ajout ou de la modification d'entrées sur l'administrateur, mais, dans certains cas, c'est une véritable perte d'espace, lorsque, c'est-à-dire, éditer un champ de date de 8 caractères de large, ou un CharField, également 6 ou 8 caractères de large, puis la zone d'édition va jusqu'à 15 ou 20 caractères.
Comment puis-je indiquer à l'administrateur la largeur d'une zone de texte ou la hauteur d'une zone d'édition TextField?
Réponses:
Vous devez utiliser ModelAdmin.formfield_overrides .
Il est assez facile de
admin.py
définir:la source
filter_horizontal
oufilter_vertical
est défini pour les champs correspondants dans YourModelAdmin. J'ai passé du temps à comprendre cela.models.TextField: {'widget': Textarea(attrs={'rows':4})}
mais la largeur est devenue plus petite aussi.Vous pouvez définir des attributs HTML arbitraires sur un widget en utilisant sa propriété "attrs" .
Vous pouvez le faire dans l'admin Django en utilisant formfield_for_dbfield:
ou avec une sous-classe de Widget personnalisée et le dictionnaire formfield_overrides :
la source
Pour modifier la largeur d'un champ spécifique.
Fabriqué via ModelAdmin.get_form :
la source
Une option rapide et sale consiste simplement à fournir un modèle personnalisé pour le modèle en question.
Si vous créez un modèle nommé,
admin/<app label>/<class name>/change_form.html
l'administrateur utilisera ce modèle au lieu du modèle par défaut. Autrement dit, si vous avez un modèle nomméPerson
dans une application nomméepeople
, vous créez un modèle nomméadmin/people/person/change_form.html
.Tous les modèles d'administration ont un
extrahead
bloc que vous pouvez remplacer pour placer des éléments dans le<head>
, et la dernière pièce du puzzle est le fait que chaque champ a un identifiant HTMLid_<field-name>
.Ainsi, vous pouvez mettre quelque chose comme ce qui suit dans votre modèle:
la source
Si vous souhaitez modifier les attributs sur une instance par champ, vous pouvez ajouter la propriété "attrs" directement dans vos entrées de formulaire.
par exemple:
La propriété "attrs" transmet essentiellement le balisage HTML qui ajustera le champ du formulaire. Chaque entrée est un tuple de l'attribut que vous souhaitez remplacer et de la valeur avec laquelle vous souhaitez le remplacer. Vous pouvez entrer autant d'attributs que vous le souhaitez tant que vous séparez chaque tuple par une virgule.
la source
Le meilleur moyen que j'ai trouvé est quelque chose comme ceci:
C'est beaucoup mieux pour ModelForm que de remplacer les champs avec différents widgets, car il préserve
name
et leshelp_text
attributs ainsi que les valeurs par défaut des champs de modèle, vous n'avez donc pas à les copier dans votre formulaire.la source
J'ai eu un problème similaire avec TextField. J'utilise Django 1.0.2 et je voulais changer la valeur par défaut des «lignes» dans la zone de texte associée. formfield_overrides n'existe pas dans cette version. Le remplacement de formfield_for_dbfield fonctionnait mais je devais le faire pour chacune de mes sous-classes ModelAdmin ou cela entraînerait une erreur de récursivité. Finalement, j'ai trouvé que l'ajout du code ci-dessous à models.py fonctionne:
Utilisez ensuite MyTextField au lieu de TextField lors de la définition de vos modèles. Je l'ai adapté de cette réponse à une question similaire.
la source
C'est bien décrit dans la FAQ Django :
Q: Comment modifier les attributs d'un widget sur un champ de mon modèle?
R: Remplacez le formfield_for_dbfield dans la classe ModelAdmin / StackedInline / TabularInline
la source
Vous pouvez toujours définir la taille de vos champs dans une feuille de style personnalisée et dire à Django de l'utiliser pour votre classe ModelAdmin:
la source
pour 1.6, en utilisant des formulaires, je devais spécifier les attributs de la zone de texte à l'intérieur du champ de caractères:
la source
Même réponse que msdin mais avec TextInput au lieu de TextArea:
la source
Voici une solution simple mais flexible. Utilisez un formulaire personnalisé pour remplacer certains widgets.
Les widgets donnés dans
ElephantForm
remplaceront ceux par défaut. La clé est la représentation sous forme de chaîne du champ. Les champs non spécifiés dans le formulaire utiliseront le widget par défaut.Notez que bien que ce
age
soit un,IntegerField
nous pouvons utiliser leTextInput
widget, car contrairement àNumberInput
,TextInput
accepte l'size
attribut.Cette solution est décrite dans cet article .
la source
Si vous travaillez avec un champ ForeignKey qui implique des choix / options / un menu déroulant, vous pouvez remplacer
formfield_for_foreignkey
dans l'instance Admin:Plus d'informations sur ce modèle ici et ici .
la source
Et encore un exemple:
Si vous souhaitez modifier uniquement une taille de champ spécifique, vous pouvez l'utiliser.
la source