redirect () не передает аргументы для просмотра Django - PullRequest
0 голосов
/ 04 ноября 2019

У меня проблемы с redirect() в моих представлениях Django.

У меня есть два вида, определенные следующим образом:

# view for managing a user's account
@login_required
@require_http_methods(['GET'])
def view_account(request, updated=False):
    context = {
        'user': request.user,
        'cart_items': ShoppingCartItem.objects.filter(user_key=request.user),
        'updated': updated,
    }
    print("DEBUG: view_account: %s" % updated)    # debug
    return render(request, 'registration/view_account.html', context)

и

# view for updating information about a user's account
@login_required
@require_http_methods(['GET', 'POST'])
def update_account_info(request):
    if request.method == 'POST':
        # if this is a POST, user has submitted updated information
        form = UpdateUserInfoForm(request.POST, instance=request.user)
        if form.is_valid():
            # if valid, redirect to view_account
            form.save()
            # return render(request, 'registration/view_account.html', context)
            return redirect('/view_account', updated=True)

Мои URL для этих функций выглядят так:

path('view_account', views.view_account, name='view_account'),
path('update_account', views.update_account_info, name='update_account'),

Во второй функции я пытаюсь перенаправить пользователя в представление view_account() и передать аргумент updated=True, чтобы уведомить пользователя остраница, на которой была обновлена ​​их информация. По какой-то причине, когда я запускаю это, кажется, что оно не меняет значение по умолчанию updated.

Как вы можете видеть, я получил отладочный оператор в представлении view_account(). Вывод следующий:

[04/Nov/2019 16:51:33] "POST /update_account HTTP/1.1" 302 0
DEBUG: view_account: False
[04/Nov/2019 16:51:33] "GET /view_account HTTP/1.1" 200 1247

Не совсем уверен, что я делаю не так. Может кто-нибудь заметить что-нибудь смешное с моим кодом и / или указать мне направление поиска?

Заранее спасибо! Кроме того, я прошу прощения, если это не правильно отформатированный вопрос, я довольно новичок в StackOverflow, поэтому любые советы приветствуются.

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

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

Мое решение заключается в следующем.

Мое update_account_info представление:

# view for updating information about a user's account
@login_required
@require_http_methods(['GET', 'POST'])
def update_account_info(request):
    if request.method == 'POST':
        # if this is a POST, user has submitted updated information
        form = UpdateUserInfoForm(request.POST, instance=request.user)
        if form.is_valid():
            # if valid, redirect to view_account and re-login the user
            form.save()
            messages.add_message(request, messages.INFO, "User information updated!")
            return redirect('/view_account')

Мой view_account просмотр:

# view for managing a user's account
@login_required
@require_http_methods(['GET'])
def view_account(request):
    context = {
        'user': request.user,
        'cart_items': ShoppingCartItem.objects.filter(user_key=request.user),
    }
    return render(request, 'registration/view_account.html', context)

Мой view_account.html шаблон:

{% block messages %}
    {% if messages %}
        {% for message in messages %}
            <li {% if message.tags %} class="{{ message.tags }}" {% endif %}>{{ message }}</li>
        {% endfor %} {# for message #}
    {% endif %} {# if messages #}
{% endblock %}

Надеюсь, кто-то еще найдет это полезным!

0 голосов
/ 04 ноября 2019

Вам нужно будет изменить ваши URL. Они должны выглядеть следующим образом:

path('view_account/(?P<updated>\d+)/$', views.view_account, name='view_account'),
path('update_account', views.update_account_info, name='update_account'),

таким образом, ваш URL будет ожидать, что параметр будет передан в представление view_account. Вот похожий ответ, который я нашел: https://stackoverflow.com/a/23932182/12321427

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