2009-12-12 8 views
3

J'essaie d'appeler une vue directement depuis une autre (si c'est possible). J'ai une vue:Django: Passer une requête directement (en ligne) à une seconde vue

def product_add(request, order_id=None): 
    # Works. Handles a normal POST check and form submission and redirects 
    # to another page if the form is properly validated. 

Ensuite, j'ai une deuxième vue, qui interroge le DB pour les données du produit et devrait appeler le premier.

def product_copy_from_history(request, order_id=None, product_id=None): 
    product = Product.objects.get(owner=request.user, pk=product_id) 

    # I need to somehow setup a form with the product data so that the first 
    # view thinks it gets a post request. 
    2nd_response = product_add(request, order_id) 
    return 2nd_response 

Depuis le second a besoin d'ajouter le produit en tant que première vue le fait que je me demandais si je pouvais appeler la première vue de la deuxième. Ce que je vise, c'est de passer l'objet de requête à la deuxième vue et de renvoyer l'objet de réponse obtenu au client.

Toute aide grandement appréciée, critique aussi bien si c'est une mauvaise façon de le faire. Mais alors quelques pointeurs .. pour éviter DRY-ing.

Merci!

Gerard.

+0

Ça devrait aller. Est-ce que ça marche? –

Répondre

3

Mon dieu, à quoi je pensais. Ce serait la solution la plus propre du cours:

def product_add_from_history(request, order_id=None, product_id=None): 
    """ Add existing product to current order 
    """ 
    order = get_object_or_404(Order, pk=order_id, owner=request.user) 
    product = Product.objects.get(owner=request.user, pk=product_id) 

    newproduct = Product(
        owner=request.user, 
        order = order, 
        name = product.name, 
        amount = product.amount, 
        unit_price = product.unit_price, 
        ) 
    newproduct.save() 
    return HttpResponseRedirect(reverse('order-detail', args=[order_id])) 
0

Une vue est une méthode python régulière, vous pouvez bien sûr les appeler les uns par rapport aux autres en vous donnant les arguments appropriés et gérer le résultat correctement (comme 404 ...). Maintenant, si c'est une bonne pratique, je ne sais pas. Je voudrais moi-même une méthode d'utilisation et l'appeler des deux points de vue.

+0

Par méthode d'utilité, vous voulez dire écrire une fonction auxiliaire séparée? – GerardJP

0

Si vous êtes satisfait de l'utilisation de votre API via HTTP, vous pouvez utiliser urllib à post une requête à votre gestionnaire de requêtes product_add. Pour autant que je sache, cela pourrait ajouter quelques problèmes si vous développez avec le serveur de développement fourni avec django, car il ne gère qu'une requête à la fois et bloquera indéfiniment (voir trac, google groups).

+0

Bon point sur l'overhead. Merci! – GerardJP