121 votes

Redimensionner les champs dans Django Admin

Django a tendance à remplir l'espace horizontal lors de l'ajout ou de la modification d'entrées dans l'administration, mais, dans certains cas, c'est un véritable gaspillage d'espace, lorsque, par exemple, on modifie un champ de date, de 8 caractères de large, ou un CharField, également de 6 ou 8 caractères de large, et que la boîte d'édition passe à 15 ou 20 caractères.

Comment indiquer à l'administrateur la largeur d'une zone de texte ou la hauteur d'une zone d'édition TextField ?

241voto

jki Points 1861

Vous devez utiliser ModelAdmin.formfield_overrides .

C'est assez facile - en admin.py définis :

from django.forms import TextInput, Textarea
from django.db import models

class YourModelAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.CharField: {'widget': TextInput(attrs={'size':'20'})},
        models.TextField: {'widget': Textarea(attrs={'rows':4, 'cols':40})},
    }

admin.site.register(YourModel, YourModelAdmin)

45voto

Carl Meyer Points 30736

Vous pouvez définir des attributs HTML arbitraires sur un widget à l'aide de sa fonction "Propriété "attrs .

Vous pouvez le faire dans l'administration de Django en utilisant formfield_for_dbfield :

class MyModelAdmin(admin.ModelAdmin):
  def formfield_for_dbfield(self, db_field, **kwargs):
    field = super(ContentAdmin, self).formfield_for_dbfield(db_field, **kwargs)
    if db_field.name == 'somefield':
      field.widget.attrs['class'] = 'someclass ' + field.widget.attrs.get('class', '')
    return field

ou avec une sous-classe de widget personnalisée et l'attribut Formfield_overrides dictionnaire :

class DifferentlySizedTextarea(forms.Textarea):
  def __init__(self, *args, **kwargs):
    attrs = kwargs.setdefault('attrs', {})
    attrs.setdefault('cols', 80)
    attrs.setdefault('rows', 5)
    super(DifferentlySizedTextarea, self).__init__(*args, **kwargs)

class MyModelAdmin(admin.ModelAdmin):
  formfield_overrides = { models.TextField: {'widget': DifferentlySizedTextarea}}

35voto

alanjds Points 402

Pour modifier la largeur d'un champ spécifique.

Réalisé via ModelAdmin.get_form :

class YourModelAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        form = super(YourModelAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields['myfield'].widget.attrs['style'] = 'width: 45em;'
        return form

22voto

jacobian Points 2892

Une solution simple et rapide consiste à 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 alors l'administrateur utilisera ce modèle au lieu du modèle par défaut. C'est-à-dire que si vous avez un modèle nommé Person dans une application nommée people vous créez un modèle nommé admin/people/person/change_form.html .

Tous les modèles d'administration ont un extrahead que vous pouvez remplacer pour placer des éléments dans le bloc <head> et la dernière pièce du puzzle est le fait que chaque champ a un identifiant HTML égal à id_<field-name> .

Ainsi, vous pourriez mettre quelque chose comme ce qui suit dans votre modèle :

{% extends "admin/change_form.html" %}

{% block extrahead %}
  {{ block.super }}
  <style type="text/css">
    #id_my_field { width: 100px; }
  </style>
{% endblock %}

11voto

Jonathan Points 183

Si vous souhaitez modifier les attributs pour chaque champ, vous pouvez ajouter la propriété "attrs" directement dans les entrées de votre formulaire.

par exemple :

class BlogPostForm(forms.ModelForm):
    title = forms.CharField(label='Title:', max_length=128)
    body = forms.CharField(label='Post:', max_length=2000, 
        widget=forms.Textarea(attrs={'rows':'5', 'cols': '5'}))

    class Meta:
        model = BlogPost
        fields = ('title', 'body')

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 saisir autant d'attributs que vous le souhaitez, à condition de séparer chaque tuple par une virgule.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X