2012-02-15 3 views
0

Je me demande comment changer le comportement d'un champ de formulaire en fonction des données de la requête ... en particulier en ce qui concerne l'Admin Django. Par exemple, j'aimerais déchiffrer un champ dans l'admin en fonction des données de la requête (telles que les variables POST ou de session). Mes réflexions doivent commencer à chercher à surcharger la méthode change_view dans django/contrib/admin/options.py, car elle a accès à la requête. Cependant, je ne sais pas comment affecter la façon dont la valeur du champ affiche le champ en fonction de la valeur de la requête. Si la requête a la valeur correcte, la valeur du champ sera affichée; sinon, la valeur du champ renvoie quelque chose comme "NA". Je pense que si je pouvais obtenir cette valeur de requête dans la méthode to_python(), je pourrais avoir un impact direct sur la façon dont le champ est affiché. Dois-je essayer de passer la valeur de la demande dans le formulaire init et puis en quelque sorte dans le champ init? Des suggestions comment je pourrais aborder cela?Django admin modifier la sortie to_python basée sur la requête

Merci d'avoir lu.

Dans models.py

class MyModel(models.Model): 
    hidden_data = models.CharField() 

Dans admin.py

class MyModelAdmin(models.ModelAdmin): 
    class Meta: 
     model = MyModel 

def change_view(self, request, object_id, extra_context=None): 
    .... # Perhaps this is where I'd do a lot of overriding? 
    .... 
    return self.render_change_form(request, context, change=True, obj=obj) 
+0

juste pour clarifier, vous voulez manipuler la valeur d'un champ particulier dans un modèle particulier visible (via l'admin), en fonction de quelque chose dans la demande? –

+0

Oui, c'est correct. –

+0

Un autre point que je devrais clarifier est que je ne veux pas que la valeur stockée change. Simplement l'affichage de cette valeur changerait. –

Répondre

1

Je n'ai pas testé, mais vous pouvez remplacer simplement la méthode render_change_form du ModelAdmin de se faufiler dans votre code modifier la valeur du champ entre lorsque le change_view est traité et le modèle réel rendu

class MyModelAdmin(admin.ModelAdmin): 
    ... 
    def render_change_form(self, request, context, **kwargs): 
     # Here we have access to the request, the object being displayed and the context which contains the form 
     form = content['adminform'].form 
     field = form.fields['field_name'] 
     ... 
     if 'obj' in kwargs: 
      # Existing obj is being saved 
     else: 
      # New object is being created (an empty form) 
     return super(MyModelAdmin).render_change_form(request, context, **kwargs) 
+0

Je vais jeter un oeil à cette méthode render_change_form. On dirait un bon moyen de se connecter à l'administrateur. Merci pour ce conseil. –

Questions connexes