Как добавить необязательные параметры в представление django, сохраняя тот же url
Допустим, у меня есть следующий URL:
http://127.0.0.1:8000/en/project_page/1/
и мой urls.py
:
path(
'project_page/<int:pid>/',
views.project_page,
kwargs={'approvalid': None},
name='project_page'
),
Вообще говоря, пользователи всегда будут обращаться через http://127.0.0.1:8000/en/project_page/1/
, но в некоторых случаях я хочу передать необязательный параметр, чтобы страница отображала необязательное содержимое.
Например, если пользователь имеет доступ: http://127.0.0.1:8000/en/project_page/1/somevalue
Я хотел бы видеть содержимое somevalue
в виде:
def project_page(request, pid, somevalue):
if somevalue:
#do something here with the optional parameter
else:
#run the view normally
После получения необязательного параметра, я хочу, чтобы структура url была оригинальной:
http://127.0.0.1:8000/en/project_page/1/somevalue
-> получить значение необязательного параметра и вернуться к исходному url -> http://127.0.0.1:8000/en/project_page/1/
Что я пробовал:
Я думал, что kwargs
сделает трюк, но я сделал что-то не так.
Я нашел это в официальной документации (Passing extra options to view functions), но кажется, что я делаю что-то неправильно.
Если вы решите использовать параметры запроса, вы можете использовать sessions
для сохранения somevalue
, перенаправления на тот же url, но без параметров запроса, а затем построить контекст на основе этого.
Что-то вроде этого (не проверено):
def project_page(request, pid):
context = {}
some_value = request.GET.get('somevalue')
if some_value:
# if somevalue is present in the query parameters,
# save it to the session and redirect
request.session["approval_id"] = some_value
return redirect('project_page')
if request.session.get("approval_id"):
context['nbar'] = "example1"
else:
context['nbar'] = "example2"
return render(request, "mypage.html", context)