2013-05-29 3 views
5

Tout d'abord, je veux que les deux vues utilisent exactement la même URL car je ne veux pas rendre mon URLConf plus compliqué. Je veux des vues séparées pour GET et POST pour rendre mon code plus propre. Le code est quelque chose comme ceci:Comment écrire des vues séparées pour GET et POST

def view2 (request): 
    # handle POST request, possibly a ajax one 
    return HTTPRESPONSE(json_data, mimetype="Application/JSON") 

def view1 (request): 
    if method == POST: 
     view2(request) 
     # What should I return here??? 

    else: 
     # handle GET 
     return render(request, template, context) 

Ma question concerne la ligne # What should I return here???. Si je ne mets pas un retour là-bas, l'erreur se produit:

ne pas retourner la réponse http

Mais je reviens déjà une réponse HTTP dans view2. Comment puis-je faire ce travail?

+0

Vous devez 'retour view2 (demande) '. View2 a renvoyé le résultat à l'appelant (qui est 'view1'), mais l'appelant doit également le renvoyer. – J0HN

Répondre

4

Vous devez retourner les résultats de view2:

def view1 (request): 
    if request.method == 'POST': 
     return view2(request) 
    else: 
     # handle GET 
     return render(request, template, context) 
+0

Aha, merci! – Philip007

6

Un autre, probablement un peu plus propre moyen serait d'utiliser class-based views

from django.views.generic import TemplateView 

class View1(TemplateView): 
    def get(self, request, *args, **kwargs): 
     """handle get request here""" 

    def post(self, request, *args, **kwargs): 
     """handle post request here""" 

    def head(self, request, *args, **kwargs): 
     """handle head request here. Yes, you can handle any kind of requests, not just get and post""" 

Bien sûr, vous pouvez ajouter des méthodes communes, __init__ (ce qui est inutile, sauf si vous êtes sûr de ce que vous faites), appliquez login_required (voir this SO question) et à peu près tout ce que vous pouvez faire avec les vues django (par exemple appliquer middleware, permissions, etc.) et classes python (par ex. héritage, métaclasses/décorateurs, etc.)

En outre, il y a un tas de vue sur la base de classe générique à venir avec Django pour répondre à des situations courantes comme page de la liste, la page de détails, page d'édition, etc.

+1

J'aime vraiment cette réponse. Cela rend le code très clair et facile à maintenir. – Dunatotatos