web-dev-qa-db-fra.com

Puis-je appeler une vue depuis 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)
63
john2x

Les fonctions d'affichage doivent renvoyer un HTML rendu au navigateur (dans un HttpResponse). L'appel d'une vue dans une vue signifie que vous effectuez (potentiellement) le rendu deux fois. Au lieu de cela, factorisez simplement "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)
    ...
49
Seth

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

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

def view2(request):
    return view1(request)

Si vous ne voulez pas renvoyer la réponse HttpResponse à partir de la première vue, stockez-la simplement 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")
61
brady

Une meilleure façon est d'utiliser le système de modèles. 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(request, '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 %}
8
hobs