Django 没有反向匹配错误
Django No Reverse Match Error
一周的大部分时间我都在处理这个错误,这是我不断收到的错误:
>
NoReverseMatch at /practice/practice/2/saleinfoedit/
Reverse for 'car_detail' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['practice/practice/(?P<pk>\d)$']
我认为我已将代码简化为错误的相关部分。这个想法是有一个汽车列表页面,当您单击汽车 link 时,您可以编辑车辆的销售历史记录。最终,我将为这部分设置表单集,但只是一步一步。相关代码如下:
models.py
class Car(models.Model):
car_name = models.CharField(max_length=200)
color = models.CharField(max_length=200)
age = models.CharField(max_length=200)
def get_absolute_url(self):
return reverse('practice:car_detail',kwargs={'pk':self.pk})
def __str__(self):
return '%s' %(self.car_name)
class SaleInfo(models.Model):
car_name = models.ForeignKey(Car, on_delete=models.CASCADE,)
price = models.CharField(max_length=100)
date = models.CharField(max_length=100)
comments = models.CharField(max_length=200)
def __str__(self):
return '%s' %(self.car_name)
def get_absolute_url(self):
return reverse('practice:car_detail',kwargs={'pk':self.pk})
views.py
class IndexView(generic.ListView):
template_name = 'practice/carlist.html'
context_object_name = 'latest_car_list'
def get_queryset(self):
return Car.objects.all()
class DetailView(generic.DetailView):
model = Car
form_class = CarForm
template_name = 'practice/car_detail.html'
class UpdateView(generic.UpdateView):
model = Car
form_class = CarFormEdit
class SaleInfoUpdateView(generic.UpdateView):
model = SaleInfo
form_class = SaleInfoFormEdit
template_name = 'practice/saleinfo_form.html'
urls.py
app_name = 'practice'
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'), # shows lists of Cars via Car Name
url(r'^practice/(?P<pk>\d)$', views.DetailView.as_view(), name='car_detail'),
url(r'^practice/(?P<pk>\d)/edit/$', views.UpdateView.as_view(), name='car_edit'),
url(r'^practice/(?P<pk>\d)/saleinfoedit/$', views.SaleInfoUpdateView.as_view(), name='saleinfo_edit'),
]
car_detail.html
{% extends 'practice/car_base.html' %}
{% block post_content %}
<div class="col-md-8">
<a class='btn btn-primary' href="{% url 'practice:car_edit' pk=car.pk %}">
<span class='glyphicon glyphicon-pencil'></span>
</a>
<p>{{ car.car_name|safe }}</p>
<p>{{ car.color|safe }} {{ car.age|safe }} </p>
<a class='btn btn-primary' href="{% url 'practice:saleinfo_edit' pk=car.pk %}">
<span class='glyphicon glyphicon-pencil'> SaleInfo</span>
</a>
</div>
{% endblock %}
saleinfo_form.html
{% extends 'practice/car_base.html' %}
{% block post_content %}
{% load bootstrap3 %}
<form class="" action="" method="post">
{% csrf_token %}
{% bootstrap_form form %}
<!-- {{form.as_p}} -->
<input type="submit" name="" value="Update">
</form>
{% endblock %}
如有必要,我也可以 post 我的模板。我敢肯定这很简单,我一直在寻找过去,但几天后我迷路了。
根据错误信息,您给{% url %}
标签的参数pk
为空:
...with keyword arguments '{'pk': ''}'
有两个常见的原因:
- 您模板中的变量名有错字。
- 您正在创建一个新对象,因此它还没有ID/PK。
虽然您的模板看起来不错,但我将按照以下方式对其进行调试:
- 一个接一个地删除
{% url %}
个标签,直到找到真正的罪魁祸首。
- 打印出您作为关键字参数传递的变量
pk
。
还有一件事:\d
恰好匹配一位数字,因此一旦您拥有超过 9 辆汽车,您的 URL 模式将停止工作。您必须添加一个 +
来匹配一个或多个数字:
url(r'^practice/(?P<pk>\d+)/edit/$', views.UpdateView.as_view(), name='car_edit'),
此外,正如@wencakisa 所说,Django 中的 URLs 通常以斜线结尾,但这不是强制性的。
编辑:我刚刚注意到另外两件事:
- 您的
SaleInfo.get_absolute_url
方法使用 practice:car_detail
。不应该是saleinfo_edit
吗?
在 car_detail.html 模板中,您使用 {% url 'practice:saleinfo_edit' pk=car.pk %}
。那行不通的。如果每辆车只有一个 SaleInfo,请在您的模型中使用 OneToOneField 而不是 ForeignKey。然后你可以这样做:
{% if car.sale_info %}
{% url 'practice:saleinfo_edit' pk=car.sale_info.pk %}
{% endif %}
一周的大部分时间我都在处理这个错误,这是我不断收到的错误:
>
NoReverseMatch at /practice/practice/2/saleinfoedit/
Reverse for 'car_detail' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['practice/practice/(?P<pk>\d)$']
我认为我已将代码简化为错误的相关部分。这个想法是有一个汽车列表页面,当您单击汽车 link 时,您可以编辑车辆的销售历史记录。最终,我将为这部分设置表单集,但只是一步一步。相关代码如下:
models.py
class Car(models.Model):
car_name = models.CharField(max_length=200)
color = models.CharField(max_length=200)
age = models.CharField(max_length=200)
def get_absolute_url(self):
return reverse('practice:car_detail',kwargs={'pk':self.pk})
def __str__(self):
return '%s' %(self.car_name)
class SaleInfo(models.Model):
car_name = models.ForeignKey(Car, on_delete=models.CASCADE,)
price = models.CharField(max_length=100)
date = models.CharField(max_length=100)
comments = models.CharField(max_length=200)
def __str__(self):
return '%s' %(self.car_name)
def get_absolute_url(self):
return reverse('practice:car_detail',kwargs={'pk':self.pk})
views.py
class IndexView(generic.ListView):
template_name = 'practice/carlist.html'
context_object_name = 'latest_car_list'
def get_queryset(self):
return Car.objects.all()
class DetailView(generic.DetailView):
model = Car
form_class = CarForm
template_name = 'practice/car_detail.html'
class UpdateView(generic.UpdateView):
model = Car
form_class = CarFormEdit
class SaleInfoUpdateView(generic.UpdateView):
model = SaleInfo
form_class = SaleInfoFormEdit
template_name = 'practice/saleinfo_form.html'
urls.py
app_name = 'practice'
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'), # shows lists of Cars via Car Name
url(r'^practice/(?P<pk>\d)$', views.DetailView.as_view(), name='car_detail'),
url(r'^practice/(?P<pk>\d)/edit/$', views.UpdateView.as_view(), name='car_edit'),
url(r'^practice/(?P<pk>\d)/saleinfoedit/$', views.SaleInfoUpdateView.as_view(), name='saleinfo_edit'),
]
car_detail.html
{% extends 'practice/car_base.html' %}
{% block post_content %}
<div class="col-md-8">
<a class='btn btn-primary' href="{% url 'practice:car_edit' pk=car.pk %}">
<span class='glyphicon glyphicon-pencil'></span>
</a>
<p>{{ car.car_name|safe }}</p>
<p>{{ car.color|safe }} {{ car.age|safe }} </p>
<a class='btn btn-primary' href="{% url 'practice:saleinfo_edit' pk=car.pk %}">
<span class='glyphicon glyphicon-pencil'> SaleInfo</span>
</a>
</div>
{% endblock %}
saleinfo_form.html
{% extends 'practice/car_base.html' %}
{% block post_content %}
{% load bootstrap3 %}
<form class="" action="" method="post">
{% csrf_token %}
{% bootstrap_form form %}
<!-- {{form.as_p}} -->
<input type="submit" name="" value="Update">
</form>
{% endblock %}
如有必要,我也可以 post 我的模板。我敢肯定这很简单,我一直在寻找过去,但几天后我迷路了。
根据错误信息,您给{% url %}
标签的参数pk
为空:
...with keyword arguments '{'pk': ''}'
有两个常见的原因:
- 您模板中的变量名有错字。
- 您正在创建一个新对象,因此它还没有ID/PK。
虽然您的模板看起来不错,但我将按照以下方式对其进行调试:
- 一个接一个地删除
{% url %}
个标签,直到找到真正的罪魁祸首。 - 打印出您作为关键字参数传递的变量
pk
。
还有一件事:\d
恰好匹配一位数字,因此一旦您拥有超过 9 辆汽车,您的 URL 模式将停止工作。您必须添加一个 +
来匹配一个或多个数字:
url(r'^practice/(?P<pk>\d+)/edit/$', views.UpdateView.as_view(), name='car_edit'),
此外,正如@wencakisa 所说,Django 中的 URLs 通常以斜线结尾,但这不是强制性的。
编辑:我刚刚注意到另外两件事:
- 您的
SaleInfo.get_absolute_url
方法使用practice:car_detail
。不应该是saleinfo_edit
吗? 在 car_detail.html 模板中,您使用
{% url 'practice:saleinfo_edit' pk=car.pk %}
。那行不通的。如果每辆车只有一个 SaleInfo,请在您的模型中使用 OneToOneField 而不是 ForeignKey。然后你可以这样做:{% if car.sale_info %} {% url 'practice:saleinfo_edit' pk=car.sale_info.pk %} {% endif %}