Как добавить необязательные параметры в представление 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)
Вернуться на верх