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

Django+HTMX中create_cv_workexp路由反向解析失败求助

Django+HTMX提交POST请求触发NoReverseMatch异常

异常详情

django.urls.exceptions.NoReverseMatch: Reverse for 'create_cv_workexp' with arguments '('',)' not found. 1 pattern(s) tried: ['create\-cv\-workexp/(?P<pk>[0-9]+)/\Z']

问题原因

当表单验证失败时,视图返回workexp_form.html模板时未传入position对象,导致模板中{% url 'resume:create_cv_workexp' position.id %}的position.id为空字符串,无法匹配要求整数pk参数的路由规则,触发反向解析失败。

查看视图POST分支的错误返回逻辑:

if request.method == "POST":
    if form.is_valid():
        # 省略表单有效时的处理逻辑
    else:
        return render(request, "resume/partials/workexp_form.html", context={
            "form": form
        })

此处仅传递了form变量,缺失模板渲染必需的position对象。

解决方案

修改视图中表单验证失败的返回代码,将position对象传入上下文:

@login_required(login_url='/users/login/')
def create_cv_workexp(request, pk):
    position = Position.objects.get(id=pk)
    workexps = WorkExperience.objects.filter(pos=position)
    form = CreateCVWorkExperienceForm(request.POST or None)

    if request.method == "POST":
        if form.is_valid():
            workexp = form.save(commit=False)
            workexp.pos = position
            workexp.save()
            pk = workexp.pk
            return redirect("resume:detail-workexp", pk=pk)
        else:
            return render(request, "resume/partials/workexp_form.html", context={
                "form": form,
                "position": position  # 新增:传递position对象到模板
            })

    context = {
        "form": form,
        "position": position,
        "workexps": workexps,
        'title': 'Add company'
    }

    return render(request, "resume/create_cv_workexp.html", context)

相关代码参考

models.py

class Position(models.Model):
    position_name = models.CharField(max_length=255, blank=True, verbose_name='Position')
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='user by', blank=True, null=True)
    date_create = models.DateTimeField(auto_now_add=True)
    date_update = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['date_create']

    def __str__(self):
        return self.position_name


class WorkExperience(models.Model):
    pos = models.ForeignKey('Position', blank=True, null=True, on_delete=models.SET_NULL, verbose_name='Position Relative')
    company = models.CharField(max_length=50, verbose_name='Company', blank=True)
    position_work = models.CharField(max_length=50, verbose_name='Position', blank=True)
    link_company = models.URLField(verbose_name="Company's link", blank=True)
    date_of_employment = models.DateField(blank=True, verbose_name='Date of employment')
    date_of_dismissal = models.DateField(blank=True, verbose_name='Date of dismissal')

    def __str__(self):
        return self.company

    class Meta:
        ordering = ["-date_of_employment"]

forms.py

class CreateCVWorkExperienceForm(forms.ModelForm):
    ''' form for WorkExperience object '''

    class Meta:
        model = resume.models.WorkExperience
        fields = ('company',
                  'position_work',
                  'link_company',
                  'date_of_employment',
                  'date_of_dismissal')

urls.py

app_name = 'resume'
urlpatterns = [
    path('create-cv-workexp/<int:pk>/', views.create_cv_workexp, name='create_cv_workexp'),
    path('htmx/workexp/<int:pk>/', views.detail_workexp, name="detail-workexp"),
    # 其余路由省略
]

workexp_form.html提交按钮片段

{% else %}
    <button type="submit" hx-post="{% url 'resume:create_cv_workexp' position.id %}"
    class="...">
    Submit
</button>
{% endif %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:32:13