urls template examples example python django django-views django-urls

python - template - httpresponse django example



¿Cómo paso variables de una vista a otra y renderizo con la URL de la última vista en Django? (2)

No pienses en las vistas, piensa en el código

def _student_profile(*arg_data, **kwarg_data): context = do(arg_data, kwarg_data) return render("my_template", context) def student_profile(request, name=None, grade=None, student_id=None): data = do_things(request) data.update({"name": name, "grade": grade, "student_id": student_id}) return _student_profile(**data) def process_query(request): data = do_other_things(request) return _student_profile(**data)

Estoy construyendo un sistema de administración de estudiantes usando Django.

En este código, la búsqueda del usuario de un estudiante con el name=StudentName&grade=Grade&id=StudentID&phone=ParentPhoneNumber&report=StudentReportNumber consulta encriptada name=StudentName&grade=Grade&id=StudentID&phone=ParentPhoneNumber&report=StudentReportNumber , que se extrae con el método decrypt() .

Aquí están los dos métodos, el que procesa la consulta y el que muestra el perfil del estudiante.

No se guardan datos de la consulta en la base de datos, pero se usarán para consultar los detalles del estudiante desde la base de datos.

def process_query(request): # process the query from the url /?details={{ some hashes here }} if request.method == ''GET'': raw_deatils = request.GET.get(''details'', None) if raw_deatils: details = decrypt(raw_deatils) # decrypt is a function that is defined # in the utils which takes the input string, # check predeifined tests to test if valid. # and return the decrypted query string else None if details: # now the decrypted message looks something like this. # name=StudentName&grade=Grade&id=StudentID&phone= # ParentPhoneNumber&report=StudentReportNumber # some more processing pulls out value to variables, name = details[''StudentName''], grade = details[''Grade''], student_id = details[''StudentID''], phone = details[''ParentPhoneNumber''], report = details[''StudentReportNumber''], search_token = details[''token''] return redirect("somewhere I''m stuck") else: # encryption error, so redirect user to query page else: # error with submission redirect to query page else: # error with method. redirect to homepage. def student_profile(request, name=None, grade=None, student_id=None): # token to be added?? # some data processing to get marks, # progress report. etc if student_id: context = { ''name'' : name, ''grade'' : grade, ''student_id'' : student_id, ''report'' : report, ''marks'': { # another dictionary of dictionaries # as the product of the processing }, ''token'' : token, ''attendance'': { # another dicitonary of stuff. } else: context = { ''name'' : name, ''grade'' : grade, } return render(request, ''students/profile/single.html'', context)

urls para esto,

url(r''^go/$'', ''students.views.process_query'' name=''process_view''), url(r''^profile/(?P<name>[a-zA-Z]{1,20})/(?P<grade>[a-zA-Z]{1,20})$'', ''students.views.student_profile'', name=''profile_view''),

siempre que se llame a profile_view sin ''process_view'', solo se mostrarán el nombre y la calificación. Si el profile_view es iniciado por el process_view el contexto con asistencia y marcas debe ser renderizado.

Esto funciona hasta la redirección de process_view , pero no tengo ni idea de dónde debería redireccionar (o incluso si debería redireccionar? Stuck ) y llamar a la profile_view .

Entonces el resumen de la pregunta,

¿Cómo redirecciono de process_view a profile_view sin perder los datos recopilados en process_view en profile_view y presento el contenido con la url de profile_view ? No quiero que el token y student_id se muestren en la url.

Gracias por cualquier sugerencia / ayuda.


Para acceder a las variables token y student_id en student_id , puede usar request.session .

En su process_view , configure token y student_id en la sesión.

def process_view(..): ... request.session[''token''] = token # set ''token'' in the session request.session[''student_id''] = student_id # set ''student_id'' in the session ..

Luego, en su profile_view , puede acceder a estas 2 variables desde la sesión. Entonces no necesita pasar esas 2 variables en la URL.

def profile_view(..): ... token = request.session[''token''] # get ''token'' from the session student_id = request.session[''student_id''] # get ''student_id'' from the session ..

Puede establecer otras variables también en la sesión que pueda necesitar en profile_view .