Django页面404错误求助:URL意外追加单引号问题排查
Django 404错误排查:URL意外追加单引号
问题现象
从用户个人页面点击「Create Clinic」跳转时触发404错误,生成的URL中意外包含单引号:http://127.0.0.1:8000/profile/'/clinic/add_clinic/
相关代码片段
项目URL配置
urlpatterns = [ # django admin path('admin/', admin.site.urls), # User management path('accounts/', include('allauth.urls')), # local apps path('', include('pages.urls')), # new path('clients/', include('clients.urls')), # new path('behaviors/', include('behaviors.urls')), path('clientsessions/', include('clientsessions.urls')), path('profile/', include('users.urls')), path('clinic/', include('clinic.urls')), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
users应用URL配置
urlpatterns = [ path('', views.profile, name='profile'), ]
profile视图
@login_required def profile(request): if request.method == 'POST': user_form = UpdateUserForm(request.POST, instance=request.user) profile_form = UpdateProfileForm(request.POST, request.FILES, instance=request.user.profile) if user_form.is_valid() and profile_form.is_valid(): user_form.save() profile_form.save() messages.success(request, 'Your profile is updated successfully') return redirect(to='users-profile') else: user_form = UpdateUserForm(instance=request.user) profile_form = UpdateProfileForm(instance=request.user.profile) return render(request, 'users/profile.html', {'user_form': user_form, 'profile_form': profile_form})
clinic应用URL配置
urlpatterns = [ path('clinic/', views.clinic, name='clinic'), path('add_clinic/', views.add_clinic, name='add_clinic'), ]
add_clinic视图
@login_required @allower_users(allowed_roles=['admin']) def add_clinic(request): if request.method == 'POST': name = request.POST.get('name') if name: name = Clinic.objects.create(name=name, created_by=request.user) clinic.members.add(request.user) clinic.save() userprofile = request.user.profile userprofile.active_clinic_id = clinic.id userprofile.save() return redirect(to='users-profile') return render(request, 'clinic/add_clinic.html')
profile.html跳转代码片段
<div class="row"> <!-- Profile Header card --> <div class="col-sm-4"> <div class="card"> <div class="card-body"> <img class="rounded-circle account-img" src="{{ user.profile.avatar.url }}" style="cursor: pointer; margin-bottom: 1rem;"/> <h5 class="card-title">{{ user.first_name }} {{ user.last_name }}</h5> <a href="'{% url 'clinic:add_clinic' %}'">Create Clinic</a> <div> <p><a href="{% url 'account_logout' %}">Log Out</a></p> </div> </div> </div> </div>
问题原因与解决方案
核心问题
profile.html中的跳转链接多了额外的单引号:
<a href="'{% url 'clinic:add_clinic' %}'">Create Clinic</a>
模板渲染时,外层的单引号会被直接输出为URL的一部分,导致生成的路径被错误追加单引号,触发404。
修复方法
去掉href属性中多余的单引号,修改为:
<a href="{% url 'clinic:add_clinic' %}">Create Clinic</a>
额外优化点
- clinic应用URL配置冗余:项目已通过
path('clinic/', include('clinic.urls'))挂载路由,而clinic内部又定义了path('clinic/', views.clinic, name='clinic'),会导致该页面URL为/clinic/clinic/,若不符合预期,可将内部路由改为path('', views.clinic, name='clinic')。 - add_clinic视图变量错误:
name = Clinic.objects.create(...)后,后续代码使用未定义的clinic变量,应改为clinic = Clinic.objects.create(...),避免触发NameError。
内容的提问来源于stack exchange,提问作者Sean Duplantis
相关产品推荐
相关产品推荐

