Django Успешный URL-адрес добавляется к промежуточному URL-адресу перенаправления, а не к успешному URL-адресу - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть форма с полем имени пользователя, расположенным по адресу /accounts/choose-username/.

views.py

from django.views.generic import FormView

from .forms import ChooseUsernameForm
from django.contrib.auth import get_user_model

User = get_user_model()

class ChooseUsernameView(FormView):

    template_name = 'registration/choose-username.html'
    form_class = ChooseUsernameForm
    success_url = 'accounts/profile/' # <-------------

    def form_valid(self, form):
        """If the form is valid, redirect to the supplied URL."""
        print(form.cleaned_data['username'])
        print(self.request.user)
        user = User.objects.get(email=self.request.user)
        user.username = form.cleaned_data['username']
        user.save()
        return super().form_valid(form)

middleware.py

from django.shortcuts import redirect, reverse

class SimpleMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)
        if request.user.is_authenticated:
            if request.user.username is None:
                print(request.path)
                if not request.path == reverse('choose_username'):
                    return redirect(reverse('choose_username'))

        return response

Когда Я отправляю форму, мой URL-адрес accounts/choose-username/accounts/profile/

Я хочу, чтобы она была accounts/profile/

MIDDLEWARE settings.py выглядит так:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'accounts.middleware.SimpleMiddleware', #           <---
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Мой вопрос

Почему мой успешный URL добавляется к моему accounts/choose-username/ URL? Как я могу это исправить?

1 Ответ

1 голос
/ 13 апреля 2020

Поскольку это - accounts/profile/ - не начинается с sla sh (/), поэтому это относительный путь . Браузеры автоматически добавляют относительный путь к URL текущей страницы.

Вам необходимо использовать абсолютный путь (добавить sla sh в начале).

success_url = '/accounts/profile/'
...