94 votes

Puis-je appeler une vue à partir d'une autre vue?

L'une de mes vues doit ajouter un élément, ainsi que d'autres fonctionnalités, mais j'ai déjà une autre vue qui ajoute spécifiquement un élément.

Puis-je faire quelque chose comme:

 def specific_add_item_view(request):
    item = Item.objects.create(foo=request.bar)

def big_view(request):
    # ...
    specific_add_item_view(request)
 

90voto

brady Points 845

Bien sûr, tant que tout est dit et fait, votre vue renvoie un objet HttpResponse. Ce qui suit est complètement valide:

 def view1(request):
    # do some stuff here
    return HttpResponse("some html here")

def view2(request):
    return view1(request)
 

Si vous ne souhaitez pas renvoyer la réponse HttpResponse à partir de la première vue, stockez-la dans une variable à ignorer:

 def view1(request):
    # do some stuff here
    return HttpResponse("some html here")

def view2(request):
    response = view1(request)
    # do some stuff here
    return HttpResponse("some different html here")
 

61voto

Seth Points 18568

Les fonctions d'affichage doivent renvoyer un code HTML rendu au navigateur (sous forme de HttpResponse ). L'appel d'une vue dans une vue signifie que vous effectuez (potentiellement) le rendu deux fois. Au lieu de cela, factorisez simplement le "ajouter" dans une autre fonction qui n'est pas une vue, et demandez aux deux vues de l'appeler.

 def add_stuff(bar):
    item = Item.objects.create(foo=bar)
    return item

def specific_add_item_view(request):
    item = add_stuff(bar)
    ...

def big_view(request): 
    item = add_stuff(bar)
    ...
 

13voto

hobs Points 3020

Un meilleur moyen consiste à utiliser le système de modèles et à combiner les idées de Seth et Brady.

 def specific_add_item_view(request, extra_context_stuff=None):
    Item.objects.create()
    context_variables = {} # obviously want to populate this
    if extra_context_stuff:
        context_variables.update(extra_context_stuff)
    return render_to_response('app_name/view1_template.html', context_variables)

def bigger_view(request):
    extra_context_stuff = {'big_view': True}
    return specific_add_item_view(request, extra_context_stuff)
 

Et votre app_name / view1_template.html peut contenir une balise de modèle conditionnelle

 {% if big_view %}
<p>Extra html for the bigger view</p>
{% endif %}
 

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