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

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>

额外优化点

  1. clinic应用URL配置冗余:项目已通过path('clinic/', include('clinic.urls'))挂载路由,而clinic内部又定义了path('clinic/', views.clinic, name='clinic'),会导致该页面URL为/clinic/clinic/,若不符合预期,可将内部路由改为path('', views.clinic, name='clinic')。
  2. add_clinic视图变量错误:name = Clinic.objects.create(...)后,后续代码使用未定义的clinic变量,应改为clinic = Clinic.objects.create(...),避免触发NameError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:15:40