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
相关产品推荐
相关产品推荐

