2010-11-29 5 views
0

Supposons que j'ai une propriété de modèle persistante qui n'est pas sauvegardée par un champ de modèle, comment puis-je autoriser la modification de ce champ dans l'interface d'administration?Champs supplémentaires dans l'interface d'administration de Django

Exemple de configuration:

# models.py 

# appropriate imports... 

class MyModel(Model): 
     # regular fields. 
    foo = CharField(max_length=50) 
    bar = BooleanField() 
    # ... 

     # custom property, backed by a file. 
    def _get_meh (self): 
     return ... # read from file 
    def _set_meh (self, value): 
     ... # write to file. 
    meh = property(_get_meh, _set_meh) 

valeur de meh est stocké dans un fichier sur le disque qui est chemin dépend de la valeur foo. J'aimerais pouvoir modifier la valeur de meh à partir de l'interface d'administration.

# admin.py 

# appropriate imports... 

class MyModelAdmin(ModelAdmin): 
    # what do I put here? 

Remarque: au cas où quelqu'un a besoin de demander, j'utilise la version 1.2.1 de Django, mais la mise à niveau est possible si cela est requis par votre solution. Tout ce qui fonctionne sur Python 2.5 fera l'affaire, je ne peux pas vraiment mettre à jour pour le moment.

+0

Note complémentaire: 'meh' est stocké sur le disque parce que cette valeur particulière est récupérée par un autre logiciel que je ne peux pas/ne veux pas modifier. –

+0

Vous pouvez accéder à la page référencée dans le commentaire de tinsukE ici: http://web.archive.org/web/20120828045035/http://www.hindsightlabs.com/blog/2010/02/11/adding-extra-fields- to-a-model-form-in-djangos-admin/ –

Répondre

1

Jetez un oeil à ceci: http://www.scribd.com/doc/68396387/Adding-extra-fields-to-a-model-form-in-Django%E2%80%99s-admin-%E2%80%93-Hindsight-Labs (celui-ci est allé en ligne, http://www.hindsightlabs.com/blog/2010/02/11/adding-extra-fields-to-a-model-form-in-djangos-admin/)

Fondamentalement, vous allez créer un MyModelFrom de sous-classé forms.ModelForm et:

  1. Ajoutez les champs meh supplémentaires à la définition MyModelFrom.
  2. Substituez le constructeur de MyModelFrom, définissez la propriété self.initial meh si une instance de modèle a été transmise au formulaire.
  3. Substituez la méthode save de MyModelFrom, définissez la propriété meh sur l'instance de modèle en fonction des champs de formulaire.

De cette façon, la propriété meh serait rempli correctement à votre modèle, mais vous aurez également besoin de remplacer la méthode save() MyModel persister effectivement cette valeur à votre fichier de disque:

(Google pour « modèle django override sauver », SRY, il semble que je ne peux pas poster plus d'un lien par réponse jusqu'à ce que je reçois plus de 10 rep ...)

Cheers,

+0

Désolé pour la mise à jour tardive sur ce problème. Cela ressemble à ce que je cherchais. Merci pour le conseil! –

+0

@tinsukE Mauvais lien, FYI –

+0

Essayez de cette façon: http://web.archive.org/web/20120828045035/http://www.hindsightlabs.com/blog/2010/02/11/adding-extra-fields -to-a-model-form-in-djangos-admin/crédit va à @GarethJames. – Maerlyn

1

La connaissance de Django n'est pas terrible, mais en fonction de la complexité que vous voulez, je ne suis pas sûr que quelque chose comme ça puisse être facilement fait sans beaucoup de piratage.

De toute façon, si vous voulez l'ajouter à la page Ajouter MyModel, vous pouvez modifier le modèle d'administration approprié.

donc dans votre répertoire de modèle, créez quelque chose comme:

admin/app_label/MyModel/change_form.html 

étendre ensuite le modèle de base, et d'ajouter votre propre contenu:

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

{% block something_you_want_to_override %} 
    <p>Your HTML goes here</p> 
{% endblock %} 

Est-il vraiment aucun moyen que vous pouvez obtenir cette coutume champ dans un champ Django réel si? Vous pouvez sûrement remplacer la méthode save() sur le modèle et le faire de cette façon? Ou utilisez un signal pre_save?

Cheers, Victor

+0

Cela semble plutôt cool. Je pense aussi à implémenter un champ personnalisé, mais le chemin du fichier concerné dépend de la valeur d'un autre champ, donc c'est un peu difficile à implémenter de cette façon. –

+0

Je vais essayer votre solution demain. Si cela donne un bon résultat, je vais accepter cela comme réponse. –

Questions connexes