Django中/user_signup等URL出现404错误,请求排查
Django应用URL 404及模板不存在问题排查
问题描述
开发了一款支持用户登录、登出、航班搜索、航班预订及查看预订的Web应用,目前/login、/logout、/admin可正常访问,但/user_signup等URL出现404错误。调整模板文件夹位置后又出现「Template doesn't exist」错误。
相关代码
app的urls.py
from django.urls import path from . import views urlpatterns = [ path('', views.home, name='home'), path('search_flights/', views.search_flights, name='search_flights'), path('book_flight/<int:flight_id>/', views.book_flight, name='book_flight'), path('my_bookings/', views.my_bookings, name='my_bookings'), path('login/', views.user_signup, name='login'), path('signup/', views.user_signup, name='signup'), ]
app的views.py
from django.shortcuts import render, redirect from django.contrib.auth.forms import AuthenticationForm, UserCreationForm from django.contrib.auth import authenticate, login from django.contrib.auth.decorators import login_required from .models import Flight, Booking from django.contrib.auth.forms import UserCreationForm from .forms import SignUpForm, SignInForm, EditProfileForm def home(request): flights = Flight.objects.all() return render(request, 'home.html', {'flights': flights}) @login_required def search_flights(request): if request.method == 'POST': date = request.POST.get('date') time = request.POST.get('time') flights = Flight.objects.filter(date=date, time=time) return render(request, 'search_flights.html', {'flights': flights}) return render(request, 'search_flights.html') @login_required def book_flight(request, flight_id): flight = Flight.objects.get(id=flight_id) if request.method == 'POST': # Check if seats are available if flight.seats_available() > 0: # Book the ticket booking = Booking.objects.create(flight=flight, user=request.user) return redirect('my_bookings') else: # Show error message return render(request, 'book_flight.html', {'flight': flight, 'error': 'No seats available.'}) return render(request, 'book_flight.html', {'flight': flight}) @login_required def my_bookings(request): bookings = Booking.objects.filter(user=request.user) return render(request, 'my_bookings.html', {'bookings': bookings}) def user_login(request): if request.method == 'POST': form = AuthenticationForm(request, data=request.POST) if form.is_valid(): username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') user = authenticate(username=username, password=password) if user is not None: login(request, user) return redirect('home') else: form = AuthenticationForm() return render(request, 'login.html', {'form': form}) def user_signup(request): if request.method == 'POST': form = UserCreationForm(request.POST) if form.is_valid(): user = form.save() login(request, user) return redirect('home') else: form = UserCreationForm() return render(request, 'signup.html', {'form': form})
项目主urls.py
from django.urls import path, include from . import views from django.contrib import admin from django.views.generic.base import TemplateView urlpatterns = [ path(r'admin/',admin.site.urls), path('', views.home, name='home'), path('app/', include('app.urls')), path('',include('django.contrib.auth.urls')), path('',TemplateView.as_view(template_name='home.html'),name='home') ]
目录结构
flight └─ flight_booking ├─ app │ ├─ admin.py │ ├─ apps.py │ ├─ migrations │ │ ├─ 0001_initial.py │ │ ├─ __init__.py │ │ └─ __pycache__ │ │ ├─ 0001_initial.cpython-39.pyc │ │ └─ __init__.cpython-39.pyc │ ├─ models.py │ ├─ templates │ │ └─ app │ │ ├─ book_flight.html │ │ └─ search_fights.html │ ├─ tests.py │ ├─ urls.py │ ├─ views.py │ ├─ __init__.py │ └─ __pycache__ │ ├─ admin.cpython-39.pyc │ ├─ apps.cpython-39.pyc │ ├─ forms.cpython-39.pyc │ ├─ models.cpython-39.pyc │ ├─ urls.cpython-39.pyc │ ├─ views.cpython-39.pyc │ └─ __init__.cpython-39.pyc ├─ db.sqlite3 ├─ flight_booking │ ├─ asgi.py │ ├─ settings.py │ ├─ urls.py │ ├─ views.py │ ├─ wsgi.py │ ├─ __init__.py │ └─ __pycache__ │ ├─ settings.cpython-39.pyc │ ├─ urls.cpython-39.pyc │ ├─ views.cpython-39.pyc │ ├─ wsgi.cpython-39.pyc │ └─ __init__.cpython-39.pyc ├─ manage.py └─ templates ├─ base.html ├─ home.html └─ registration ├─ login.html └─ signup.html
问题排查与修复方案
1. URL配置错误修复
- 路由指向错误:app的urls.py中,
path('login/', views.user_signup, name='login'),错误地将login路由指向注册视图user_signup,应改为path('login/', views.user_login, name='login'),。 - 缺少user_signup路由:当前urls中未定义
/user_signup,需添加:path('user_signup/', views.user_signup, name='user_signup'),。 - 主路由冲突:项目主urls.py存在多个空路径
path('', ...),导致路由匹配优先级混乱。建议调整主urls.py,移除重复的home路由,示例:urlpatterns = [ path('admin/', admin.site.urls), path('app/', include('app.urls')), path('', include('django.contrib.auth.urls')), path('', TemplateView.as_view(template_name='home.html'), name='home') ]
2. 模板路径问题修复
- 模板文件名拼写错误:目录中
search_fights.html应为search_flights.html。 - 模板引用路径错误:
- app内模板(如
search_flights.html、book_flight.html)位于app/templates/app/下,views中需用相对路径引用,例如return render(request, 'app/search_flights.html', {'flights': flights})。 login.html和signup.html位于项目根templates/registration/下,views中需引用为return render(request, 'registration/login.html', {'form': form})和return render(request, 'registration/signup.html', {'form': form})。
- app内模板(如
- 检查settings.py配置:确保
TEMPLATES中的APP_DIRS设为True,让Django自动识别app内的templates目录:TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'], 'APP_DIRS': True, # 其他配置项 }, ]
内容的提问来源于stack exchange,提问作者Aishani Singh
相关产品推荐
相关产品推荐

