77 votes

Django Admin: Utiliser un widget personnalisé pour un seul champ de modèle

J'ai un DateTimeField champ dans mon modèle. Je voulais l'afficher comme un widget de case dans le site d'administration de Django. Pour ce faire, j'ai créé un formulaire personnalisé widget. Cependant, je ne sais pas comment utiliser mon widget personnalisé pour seulement ce seul champ.

La documentation de Django explique comment utiliser un widget personnalisé pour tous les champs d'un certain type:

class StopAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.DateTimeField: {'widget': ApproveStopWidget }
    }

Ce n'est pas granulaire assez bien. Je veux le changer pour seulement un champ.

139voto

Chris Pratt Points 53859

Créez un ModelForm personnalisé pour votre ModelAdmin et ajoutez des "widgets" à sa classe Meta, comme suit:

 class StopAdminForm(forms.ModelForm):
  class Meta:
    model = Stop
    widgets = {
      'approve_ts': ApproveStopWidget(),
    }

class StopAdmin(admin.ModelAdmin):
  form = StopAdminForm
 

Terminé!

La documentation à cet effet est en quelque sorte placée de manière non intuitive dans la documentation de ModelForm, sans aucune mention de celle-ci dans la documentation de l'administrateur. Voir: Création de formulaires à partir de modèles

36voto

Belmin Fernandez Points 1882

Après avoir creusé dans l' admin, modèle de champ et champ de formulaire de code, je pense que la seule façon de réaliser ce que je veux, c'est par la création d'un modèle personnalisé champ:

models.py

from django.db import models
from widgets import ApproveStopWidget

class ApproveStopModelField(models.DateTimeField):
    pass

class Stop(models.model):
    # Other fields
    approve_ts = ApproveStopModelField('Approve place', null=True, blank=True)

admin.py

from widgets import ApproveStopWidget
from models import ApproveStopModelField

class StopAdmin(admin.ModelAdmin):
    formfield_overrides = {
        ApproveStopModelField: {'widget': ApproveStopWidget }
    }

Il fait le travail.

Pour le moment, je vais laisser la question sans réponse parce que j'ai l'habitude de manquer à l'évidence. Peut-être certains de Django petit futé a une meilleure solution.

7voto

Arya-2790306 Points 17

Django's ModelAdmin.get_changelist_form (self, request, ** kwargs) fera l'affaire pour le cas list_editable

 class StopAdminForm(forms.ModelForm):
  class Meta:
    model = Stop
    widgets = {
      'approve_ts': ApproveStopWidget(),
    }

class StopAdmin(admin.ModelAdmin):
  form = StopAdminForm

  #just return the ModelForm class StopAdminForm
  def get_changelist_form(self, request, **kwargs):
        return StopAdminForm
 

Reportez-vous à la documentation officielle de Django sur ce sujet.

J'espère que cela aidera

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