2011-04-18 2 views
0

je suit la configuration simplifiée:Django Admin: Comment enregistrer uniquement le modèle en ligne non parent

  • Un modèle basé sur les données de l'héritage qui ne peut pas être changé. Par conséquent, je lève un ValidationError pour informer l'utilisateur qu'aucune modification n'a été apportée. Les champs de formulaire sont en lecture seule et je pourrais utiliser un simple 'passage' mais je préfère recevoir le message que save() n'a pas fait ce qu'il était censé faire au lieu de faire simplement rien en silence.
  • Maintenant j'étend les données héritées avec un 2ème modèle qui devrait être éditable. Il est inclus dans ModelAdmin du modèle hérité en tant qu'inline. Je pourrais inclure le CommentModel lui-même en tant que ModelAdmin, mais comme le LegacyModel hérite de beaucoup de fonctionnalités des classes parentes, cela devient compliqué et sec.

Ce que je veux est d'effectuer l'opération "enregistrer" seulement sur le modèle en ligne. Je pensais que tous les champs sont en lecture seule, cela devrait fonctionner correctement. Quelqu'un peut-il me donner un indice pour le faire de manière propre?

class Legacy(models.Model): 

    legacyData = models.TextField() 

    def clean(self): 
     raise ValidationError("%s model is readonly." % self._meta.verbose_name.capitalize()) 

class Comment(models.Model): 

    legacy = models.OneToOneField(Legacy) 
    comment = models.TextField() 


class LegacyAdmin(admin.ModelAdmin): 

    def __init__(self, *args, **kwargs): 
     self.readonly_fields = self.fields 
     super(LegacyAdmin, self).__init__(*args, **kwargs) 

    model = Legacy 
    inlines = (CommentInline,) 

Merci beaucoup pour votre temps! :)

Répondre

Questions connexes