Django没有反向匹配错误

时间:2017-08-23 15:41:27

标签: django reverse

我在一周的大部分时间里都在处理这个错误,这是我一直接受的错误:

>

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)$']

我认为,我已将代码简化为错误的相关部分。我们的想法是拥有汽车列表页面,当您点击汽车链接时,您可以编辑汽车的销售历史记录。最终我会为这部分设置formsets,但是babysteps。这是相关代码:

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 %}

如有必要,我也可以发布我的模板。我确信它一直很简单,我一直在寻找过去,但过了几天我迷失了。

1 个答案:

答案 0 :(得分:0)

根据错误消息,您为pk标记提供的参数{% url %}为空:

...with keyword arguments '{'pk': ''}'

有两个常见原因:

  1. 您的模板中的变量名称中有拼写错误。
  2. 您正在创建新对象,因此它还没有ID / PK。
  3. 你的模板看起来很好,所以这是我如何调试它:

    1. 一个接一个地删除{% url %}个标签,直到找到真正的罪魁祸首。
    2. 将您传递的变量打印为关键字参数pk
    3. 还有一件事:\d只匹配一位数字,因此一旦您拥有超过9辆汽车,您的网址格式就会停止工作。您必须添加+以匹配一个或多个数字:

                  url(r'^practice/(?P<pk>\d+)/edit/$', views.UpdateView.as_view(), name='car_edit'),
      

      另外,就像@wencakisa所说的那样,Django中的URL通常以斜线结尾,但这不是强制性的。

      编辑:我刚注意到另外两件事:

      • 您的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 %}