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

