login_required Django重定向下一步不起作用

时间:2020-08-30 07:42:01

标签: python django redirect

你好。 我尝试通过login_required将用户重定向到他登录之前想要的页面,但是页面没有重定向! 我已经搜索了很多,但是什么也没找到。 这是我的login_required的主要代码: 我将它们归纳为相关主题。如果需要添加其他内容,请告诉我。 谢谢你。

查看:

from django.contrib.auth.decorators import login_required

def user_login(request):
    next_url = request.GET.get('next')
    print(next_url)
    if request.method == 'POST':
        form = UserLoginForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            user = authenticate(request, username=cd['username'], password=cd['password'])
            if user is not None:
                login(request, user)
                messages.success(request, 'Login Successful', extra_tags='success')
                if next_url:
                    return redirect(next_url)
                return redirect('post:all_posts')
            else:
                messages.error(request, 'Wrong Username Or Password', extra_tags='warning')
    else:
        form = UserLoginForm()
    return render(request, 'account/login.html', {'form': form})

@login_required
def dashboard(request, user_id):
    users = get_object_or_404(User, id=user_id)
    posts = Post.objects.filter(user=users)
    context = {'user': users, 'posts': posts}
    return render(request, 'account/dashboard.html', context=context)

设置:

import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

DEBUG = True

ALLOWED_HOSTS = []

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'Post.apps.PostConfig',
    'Account.apps.AccountsConfig',
]

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

ROOT_URLCONF = 'SocialNetworkP.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'SocialNetworkP.wsgi.application'

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

STATIC_URL = '/static/'
LOGIN_URL = 'account:user_login'

帐户网址:

app_name = 'account'

urlpatterns = [
    path('login/', user_login, name='user_login'),
    path('register/', register, name='user_register'),
    path('logout/', user_logout, name='user_logout'),
    path('dashboard/<int:user_id>/', dashboard, name='user_dashboard'),
]

主要网址:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('Post.urls', namespace='post')),
    path('account/', include('Account.urls', namespace='account')),
]

登录视图:

{% extends 'base.html' %}

{% block content %}
    <form action="." method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Login" class="btn btn-primary">
    </form>
{% endblock content %}

图片:

enter image description here

2 个答案:

答案 0 :(得分:1)

如您所见,GET请求中存在下一个查询,但是在提交表单时,URL查询没有被传递。您可以在与POST请求相对应的图像中看到它。您可能需要在登录表单中添加下一个URL,然后从POST数据中访问下一个URL。

在登录表单中添加隐藏字段

{% extends 'base.html' %} 
{% block content %} 
<form action="." method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <input type="hidden" name="next" value="{{ request.GET.next }}" />
    <input type="submit" value="Login" class="btn btn-primary"> 
</form> 
{% endblock content %}
{p> {{ request.GET.next }}可被settings.TEMPLATES中的请求模板上下文处理器访问

然后在您的user_login中访问request.POST的下一个网址

def user_login(request): 
    if request.method == 'POST':
        next_url = request.POST.get('next')
        # code

答案 1 :(得分:0)

可能对您有用。

def signin(request):
    if request.method == "POST":
        user_login_form = UserLoginForm(request.POST)
        email = request.POST['email']
        password = request.POST['password']
        user = authenticate(request, email=email, password=password)
        if user and user.is_active:
            login(request, user)
            try:
                if request.GET['next']:
                    return redirect(request.GET['next'])
            except Exception as e:
                return redirect('home')
        else:
            messages.error(request, "Please Enter Correct Credential")
            return render(request, 'signin.html', context={'form': user_login_form})
    else:
        user_login_form = UserLoginForm()
        return render(request, 'signin.html', context={'form': user_login_form})