Hay mucha documentación sobre Django y el método reverse(). Parece que no puedo localizar mi problema exacto. Supongamos que tengo dos urlconfs como este:

url(r'ParentLists/$', main_page, name = "main_page"),
url(r'ParentLists/(?P<grade_level>.+)/$', foo, name = "foo")

Y las dos vistas correspondientes como esta:

def main_page(request):

    if request.method == 'POST':
        grade_level = request.POST['grade_picked']
        return HttpResponseRedirect(reverse('foo', args = (grade_level,)))

    else:
        return render(request, 'index.html', context = {'grade_list' : grade_list})

def foo(request, grade_level):

    grade_level = request.POST['grade_picked']

    parent_list = # get stuff from database
    emails      = # get stuff from database

    return render(request, 'list.html', context = {'grade_list' : grade_list, 'parent_list' : parent_list}) 

Aquí, list.html simplemente amplía mi plantilla base index.html, que contiene un cuadro desplegable con los niveles de grado. Cuando el usuario accede a / ParentLists , la vista main_page muestra index.html con el cuadro desplegable como debería.

Cuando el usuario elige un nivel de grado del cuadro desplegable (por ejemplo, quinto grado), la plantilla envía un formulario y main_page se ejecuta una vez más, pero esta vez la rama POST se ejecuta y el HttpResponseRedirect toma el usuario a / ParentLists / 05 . Esto simplemente da como resultado una tabla HTML correspondiente al grado 5 que se muestra debajo del cuadro desplegable.

El problema es que, cuando el usuario selecciona ahora, por ejemplo, 10.º grado, la tabla se actualiza para mostrar el contenido del 10.º grado, pero la URL que se muestra sigue siendo / ParentLists / 05 . Quiero que sea / ParentLists / 10 .

Claramente, después de la primera selección, la vista main_page nunca se vuelve a ejecutar. Solo foo lo hace ... por lo que nunca se llama a HttpResponseRedirect. ¿Cómo debo reorganizar esto para obtener lo que estoy buscando? ¡Gracias por adelantado!

1
Pat Jones 14 dic. 2016 a las 05:48

2 respuestas

La mejor respuesta

Como mencionó correctamente, nunca redirigirá a foo () desde foo ().

Entonces, la forma simple de solucionar esto es simplemente agregar un código similar al de la vista main_page ():

def foo(request, grade_level):

    if request.method == 'POST':
        grade_level = request.POST['grade_picked']
        return HttpResponseRedirect(reverse('foo', args = (grade_level,)))
    else:
        parent_list = # get stuff from database
        emails      = # get stuff from database

        return render(request, 'list.html', context = {'grade_list' : grade_list, 'parent_list' : parent_list})

Tenga en cuenta que elimino grade_level = request.POST['grade_picked'] porque, como dijo correctamente Nagkumar Arkalgud, es excesivo.

Además, en lugar de la combinación de HttpResponseRedirect y reverse, puede usar el atajo redirect que probablemente no sea fácil de codificar:

from django.shortcuts redirect
...
return redirect('foo', grade_level=grade_level) 
2
neverwalkaloner 14 dic. 2016 a las 06:05

Te sugiero que uses kwargs en lugar de args. La forma correcta de utilizar la vista es:

your_url = reverse("<view_name>", kwargs={"<key>": "<value>"})

Por ejemplo:

return HttpResponseRedirect(reverse('foo', kwargs={"grade_level": grade_level}))

Además, está enviando "grade_level" a su vista foo usando la URL y no un valor POST. Quitaría la línea:

grade_level = request.POST['grade_picked']

Ya que anulará el grade_level enviado al método desde la URL.

0
Nagkumar Arkalgud 14 dic. 2016 a las 02:53