Django - comment pré-remplir les champs du formulaire d'administration
je sais que vous pouvez pré-peupler des champs de formulaire administrateur basés sur d'autres champs. Par exemple, j'ai un champ slug qui est automatiquement généré basé sur le champ title.
cependant, je voudrais aussi faire d'autres pré-calculs automatiques basés sur la date. Par exemple, j'ai un champ URL, et je veux qu'il soit automatiquement défini à http://example.com/20090209.mp3 où 20090209 est AAAAMMJJ.
je voudrais aussi avoir un champ de texte démarre automatiquement avec quelque chose comme "Bonjour, mon nom est l'auteur" où l'auteur est le nom de l'utilisateur actuel. Bien sûr, je veux aussi que la personne puisse éditer le champ. Le but est de faire en sorte que l'utilisateur puisse remplir le formulaire d'administration plus facilement, et pas seulement d'avoir des champs qui sont complètement automatiques.
7 réponses
je sais que vous pouvez pré-peupler certaines valeurs via GET, ce sera quelque chose comme ça
http://localhost:8000/admin/app/model/add/?model_field=hello
j'ai quelques problèmes avec les champs date mais, peut-être que cela pourrait vous aider.
la fonctionnalité pré-opulated_fields intégrée à Django est codée en dur pour slugify, elle ne peut pas vraiment être utilisée à des fins plus générales.
vous aurez besoin d'écrire votre propre fonction Javascript pour faire la pré-impression. La meilleure façon de l'obtenir inclus dans la page admin est de l'inclure dans le classe des médias internes d'un Formulaire personnalisé ou Widget. Vous aurez alors besoin de personnaliser votre ModelAdmin sous-classe utiliser le formulaire personnalisé ou un widget. Dernière, vous aurez besoin de rendre Javascript en ligne avec chaque champ pré-peuplé pour enregistrer le gestionnaire onchange et lui dire de quel autre champ il s'agit; je le rendrais via le Widget personnalisé. Pour le rendre agréable et déclaratif, vous pouvez utiliser un attribut ModelAdmin personnalisé (similaire à prepopulated_fields), et outrepasser ModelAdmin.formfield_for_dbfield pour créer le widget et passer dans les informations sur le champ à partir duquel il devrait pré-remplir.
ce genre de piratage administratif est presque toujours possible, mais (comme vous pouvez le voir à partir de ce résumé alambiqué) rarement simple, surtout si vous faites un effort pour garder votre code bien encapsulé.
j'ai récemment utilisé Django ModelAdmin.get_form méthode à cette fin.
class MyModelAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
form = super(MyModelAdmin, self).get_form(request, obj, **kwargs)
form.base_fields['my_field_name'].initial = 'abcd'
return form
Vous devez être prudent sur les effets secondaires que vous manipulez les base_fields directement.
je voudrais aussi avoir un champ de texte qui commence automatiquement par quelque chose comme "Bonjour, mon nom est auteur."
découvrez les docs: http://docs.djangoproject.com/en/dev/ref/models/fields/#default
Vous pouvez avoir un CharField() ou TextField () dans votre model, et définir cette option, qui définira le texte par défaut. "par défaut" peut aussi être une fonction appelable.
quelque Chose comme: modèle.CharField(max_length=250, par défaut="Texte par Défaut")
vous pouvez outrepasser le champ admin django par défaut en le remplaçant par un champ de formulaire de votre choix.
vérifiez ceci : ajouter une validation personnalisée à l'administrateur
la manipulation des limaces se fait avec javascript.
Donc, vous avez à remplacer les gabarits dans l'administrateur et ensuite remplir les champs avec javascript. La date devrait être triviale, mais je ne sais pas comment vous devriez obtenir le nom des utilisateurs connectés dans le script (pas que j'ai pensé très dur, mais vous obtenez la dérive :).
j'ai essayé quelques-unes de ces réponses et aucune n'a fonctionné. Je voulais simplement préparer un champ avec un autre champ d'un modèle apparenté. Prendre réponse comme point de départ, j'ai finalement essayé de manipuler l'objet model instance (ici obj
) directement et cela a fonctionné pour moi.
class MyModelAdmin(models.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
form = super(MyModelAdmin, self).get_form(request, obj, **kwargs)
if not obj.some_model_field:
obj.some_model_field = obj.related_model.prepopulating_model_field
return form