You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django视图重定向失败:无法找到URL路径或HTML模板

Django重定向问题解决方案

核心问题分析

你的重定向报错根源并非主视图的重定向写法错误,而是**UserLogin视图内部的重定向全部使用了模板文件路径(如general/dashboard.html、members/member_login.html),而非URL名称或正确的URL路径**。这种写法会被Django当作相对路径处理,导致从当前URL(如/members/user_login/)嵌套跳转,最终生成错误的URL(如/members/user_login/members/member_login.html)。

分步修复

1. 修正UserLogin视图的重定向逻辑

将所有基于模板路径的重定向,替换为对应URL的名称(需确保general应用的urls.py已设置app_name):

def UserLogin(request):
    """ Member authenticate, set session variables and login """
    if request.method == 'POST':
        username = request.POST.get('email')
        password = request.POST.get('password')
        user = authenticate(username=username, password=password)
        if user is not None:
            if user.is_active:
                """ set session expiry and variables with login"""
                login(request, user)
                request.session.set_expiry(86400)
                watchlist_items = Watchlist.objects.filter(created_by_id=user.id, status=True).values_list('listing_id', flat=True)
                print(f"watchlist_items: {watchlist_items}")
                if watchlist_items:
                    request.session['watchlist'] = list(watchlist_items)
                    print(f"watchlist session variable: {request.session['watchlist']}")
                    messages.success(request, 'You have successfully logged in')
                else:
                    request.session['watchlist'] = []
                    messages.success(request, 'You have successfully logged in')
                # 替换为general应用中dashboard的URL名称
                return redirect('general:dashboard')
            else:
                """ user has old account, prompt to reactivate and pay new subscription """
                messages.error(request, 'This account is no longer active, please reactivate account (subscription required)')
                # 替换为members应用的user_login URL名称
                return redirect('members:user_login')
        else:
            messages.error(request, 'Username or password is incorrect')
            # 替换为members应用的user_login URL名称
            return redirect('members:user_login')
    else:
        # 替换为members应用的user_login URL名称
        return redirect('members:user_login')

2. 修正主视图的两处小问题

  • 移除raise关键字:raise messages.add_message(...)会抛出异常,导致后续的return redirect无法执行,直接调用messages.add_message即可
  • 重定向使用URL名称而非硬编码路径:
if form.is_valid():
    """ check if passwords match """
    print('form is valid')
    password1 = form.cleaned_data.get('password1')
    password2 = form.cleaned_data.get('password2')
    if password1 and password2 and password1 != password2:
        # 移除raise,直接添加错误消息
        messages.error(request, "Passwords don't match")
        # 使用URL名称重定向
        return redirect('members:new_profile')

    """ create user, set hashed password, redirect to login page """
    print('creating user')
    user = form.save(commit=False)
    user.set_password(password1)
    user.save()
    # 此处写法正确,保持不变
    return redirect('members:user_login')

3. 确保general应用的urls.py设置app_name

如果general/urls.py还没设置应用命名空间,需要补充:

from django.urls import path
from general import views

app_name = 'general'

urlpatterns = [
    # 假设dashboard的路径配置如下,name需和视图中redirect的名称对应
    path('dashboard/', views.Dashboard, name='dashboard'),
    # 其他URL配置...
]

验证正确的重定向写法

  • 跨应用重定向:使用应用名:URL名称格式,如redirect('members:user_login')、redirect('general:dashboard')
  • 同应用内重定向:可直接使用URL名称,如在members应用内视图中redirect('user_login')

内容的提问来源于stack exchange,提问作者Topher76

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 11:00:07