Como passar variáveis de uma view para outra e renderizá-las com o URL da última view no Django?
Estou construindo um sistema de gerenciamento de estudantes usando o Django.
Nesse código, o usuário procura um aluno com a consulta criptografadaname=StudentName&grade=Grade&id=StudentID&phone=ParentPhoneNumber&report=StudentReportNumber
, que é extraído com odecrypt()
método.
Aqui estão os dois métodos, aquele que processa a consulta e o que mostra o perfil do aluno.
Nenhum dado da consulta é salvo no banco de dados, mas será usado para consultar os detalhes do aluno no banco de dados.
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 isso,
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'),
sempre queprofile_view
é chamado sem 'process_view', apenas o nome e a nota devem ser mostrados. Se oprofile_view
é iniciado peloprocess_view
o contexto com presença e marcas deve ser renderizado.
Isso funciona até oprocess_view
redirecionar, mas não tenho idéia de onde devo redirecionar (ou mesmo redirecionar?preso) e chamando oprofile_view
.
Então, o resumo da pergunta,
Como redirecionar deprocess_view
paraprofile_view
sem perder dados coletados emprocess_view
aoprofile_view
e renderize o conteúdo com o URL deprofile_view
? Eu não quero otoken
estudent_id
para ser mostrado no URL.
Obrigado por todas as sugestões / ajuda.