django redirect () с параметрами - PullRequest
       0

django redirect () с параметрами

7 голосов
/ 29 февраля 2012

Было задано несколько похожих вопросов, но я не смог найти ответ на свою проблему после долгих часов.

В приведенном ниже коде, когда я перенаправляю на «anotherView» из «myView» с параметром «username», он работает нормально, как и ожидалось. Но мне нужно включить параметр «диапазон» в это перенаправление тоже, так как этот «диапазон» требуется для шаблона, используемого после перенаправления. Всякий раз, когда я пытаюсь сделать, я получаю несколько ошибок, таких как:

- «Не смешивайте * args и ** kwargs при обращении к reverse ()»

Есть ли способ управлять этим так, как я хочу?

   def myView(request):
      if request.user.is_authenticated():
        if request.method == 'POST':
                #my code comes here
                ....
                return redirect('anotherView', username=request.user.username, {"range": range(int(layout))})



   def anotherView(request,username):
      if request.user.is_authenticated():
        #my code comes here
          ....
          return redirect(something)

Ответы [ 4 ]

20 голосов
/ 29 февраля 2012

redirect - это просто оболочка вокруг HttpResponseRedirect, которая автоматически вызывает reverse, чтобы вы создали URL для перенаправления. В результате параметры, которые вы передаете в него, не являются произвольными, они должны быть такими же, как и в reverse, и, в частности, только те, которые необходимы для создания URL.

У многих людей возникают проблемы с пониманием того, что данные нельзя просто произвольно передать в представление. HTTP - это протокол без сохранения состояния: каждый запрос существует сам по себе, как если бы пользователь никогда не был на любой другой странице сайта. Концепция сеанса была создана для того, чтобы обеспечить ощущение «состояния» для связной единицы, такой как сайт. В сеансах данные хранятся в некоторой форме постоянного хранилища и «ключом» для поиска этих данных, передаваемых клиенту (обычно браузеру пользователя). При следующей загрузке страницы клиент отправляет ключ обратно на сервер, а сервер использует его для поиска данных, чтобы создать видимость состояния.

В результате, если вам нужны данные из одного представления, доступные в другом, вам необходимо добавить их в сеанс, выполнить перенаправление и найти данные в сеансе из следующего представления.

1 голос
/ 25 апреля 2013

Вместо перенаправления на целевой URL, просто вызовите функцию просмотра назначения напрямую:

def myView(request):
    if request.user.is_authenticated():
        if request.method == 'POST':
            #my code comes here
            ....
            return anotherView(request, username, range)



def anotherView(request,username,range):
    if request.user.is_authenticated():
        #my code comes here
        ....
        return HttpResponse(something)
0 голосов
/ 29 февраля 2012

Чему вы пытаетесь передать переменную range?другой вид?Там нет параметра, чтобы принять это.Я думаю, что вы, возможно, ищете функцию reverse () , но трудно сказать.

0 голосов
/ 29 февраля 2012

Redirect принимает имя представления для перенаправления и любые атрибуты, которые будут переданы другому представлению. В вашем случае anotherView имеет только два параметра - запрос и имя пользователя, однако при перенаправлении вы передаете ему больше информации.

Вы можете попробовать что-то вроде:

def anotherView(request, username, *args, **kwargs):
    ...

Это позволит вам передать больше атрибутов.

Редактировать

Как насчет этого в исходном виде:

kwargs = {"range": range(int(layout))}
return redirect('anotherView', username=request.user.username, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...