0
votes

Comment utiliser parse_qs pour rediriger d'une vue vers une autre?

J'ai une maison dans laquelle j'ai un formulaire dans lequel je reçois des informations d'étudiants pour leur suggérer des programmes auxquels postuler. La vue d'accueil est la suivante:

def home(request):
    template_name = 'home.html'
    home_context = {}
    if request.POST:
        my_form = MyModelForm(request.POST)
        if my_form.is_valid():
            #  do some stuff
            querystring = request.POST
            return redirect(reverse('programs') + '?' + parse_qs(querystring, keep_blank_values=True))
    else:
        my_form = MyModelForm()
    home_context.update({'my_form': my_form, })
    return render(request, template_name, home_context)

Dans la deuxième vue, j'ai le même formulaire et je veux que ce formulaire soit pré-occupé avec les informations que j'ai saisies dans la page d'accueil. C'est pourquoi dans ce qui précède, j'ai passé ma requête POST à ​​la vue programmes qui est comme ci-dessous:

def programs(request):
    template_name = 'programs.html'
    programs_context = {}
    if request.POST:
        my_form = MyModelForm(request.POST)
        if my_form.is_valid():
            #  do some other stuff
    else:
        my_form = MyModelForm()
    programs_context.update({'my_form': my_form, })
    return render(request, template_name, programs_context)

L'inconvénient de cette stratégie (passer la requête POST dans la vue d'accueil à la program_view) est que l'URL dans la barre d'URL ne change pas en «example.com/programs» et reste comme «example.com». J'aurai quelques problèmes, notamment des problèmes de pagination des programmes. L'alternative est que je fais ceci:

def home(request):
    template_name = 'home.html'
    home_context = {}
    if request.POST:
        my_form = MyModelForm(request.POST)
        if my_form.is_valid():
            #  do some stuff
            return programs(request)
    else:
        my_form = MyModelForm()
    home_context.update({'my_form': my_form, })
    return render(request, template_name, home_context)

Tout d'abord, j'obtiens une erreur lorsque je fais ceci: l'objet 'QueryDict' n'a pas d'attribut 'decode'

Deuxièmement, je ne sais pas quoi faire dans la vue des programmes pour utiliser la requête que j'envoie à la branche get de la vue des programmes.

Troisièmement, j'ai besoin de ce que j'ai utilisé à faire dans la branche post de la vue programmes dans la branche get de la vue programmes si cela provient d'une redirection et non d'une requête get directe indépendante. Comment puis-je distinguer cela dans les programmes obtenir une demande?

Dans l'ensemble, toute solution alternative et aide sont très appréciées.


0 commentaires

3 Réponses :


0
votes

Utilisez request.GET ['your_key'] pour obtenir les données transmises dans une chaîne de requête.

Vous pouvez consulter cette réponse SO .


0 commentaires

0
votes

Ce n'est pas du tout ce que fait parse_qs . L'analyse consiste à prendre une chaîne - c'est-à-dire une chaîne de requêtes - et à la transformer en objets utilisables; ce que vous voulez faire, c'est le contraire, prendre le POST et le transformer en une chaîne de requêtes; c'est-à-dire l'encoder, pas l'analyser.

Notez que malgré ce que vous avez appelé, request.POST n'est pas une chaîne de requêtes, c'est un QueryDict. Pour encoder ce dict dans une chaîne, vous pouvez utiliser la méthode urlencode : request.POST.urlencode()

Cependant, cela ne fonctionnera toujours pas, car une redirection est toujours un GET et votre formulaire de destination attend un POST. Ce n'est pas du tout la bonne approche; à la place, ce que je ferais serait de stocker le querydict dans la session et de l'utiliser à partir de là dans la deuxième vue.


1 commentaires

Je publierai ce que j'ai fait comme réponse et ajouterai une question que j'ai. Merci pour votre réponse.



0
votes

J'ai une maison dans laquelle j'ai un formulaire dans lequel je reçois des informations d'étudiants pour leur suggérer des programmes auxquels postuler. La vue d'accueil est comme ci-dessous:

def programs(request):
    template_name = 'programs.html'
    programs_context = {}
    if request.POST:
        my_form = MyModelForm(request.POST)
        if my_form.is_valid():
            #  do some other stuff
    else:
        # if the get is from redirect
            my_form = MyModelForm(request.GET)
            #  do some other stuff
        # else:
            my_form = MyModelForm()
    programs_context.update({'my_form': my_form, })
    return render(request, template_name, programs_context)

et ceci dans la vue programmes

def home(request):
    template_name = 'home.html'
    home_context = {}
    if request.POST:
        my_form = MyModelForm(request.POST)
        if my_form.is_valid():
            querystring = urlencode(request.POST)
            return redirect(reverse('programs') + '?' + querystring)

    else:
        my_form = MyModelForm()
    home_context.update({'my_form': my_form, })
    return render(request, template_name, home_context)

Je veux maintenant définir la méthode get des programmes view into to parts en vérifiant si une requête provient de la saisie de example.com/programs ou de la partie redirection de la vue d'accueil. Quelle est la méthode standard pour ce faire? Quelle est la manière standard d'écrire le if et else commenté ci-dessus?


0 commentaires