2017-08-23 74 views
0

我一直對這個錯誤了一個星期的大部分時間,這是我不斷收到錯誤:Django的無反向匹配錯誤

>

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

我已經簡化了代碼我想這是什麼錯誤的相關部分。這個想法是有一個汽車列表頁面,當你點擊汽車鏈接,你可以編輯車輛的銷售歷史。最終我會爲這部分安裝套件,但是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 %} 

我可以在必要時發佈我的模板了。我確信這是簡單的,我一直在尋找過去,但幾天後我迷路了。

+2

安置自己的模板,你在哪裏上市了被點擊這些網址。 – marcusshep

+0

嗨,這篇文章可以幫助你[示例](https://stackoverflow.com/a/17824769/7261317)其必須工作... – Robert

+0

我已經在模板中添加了請求。 – Jcb1125

回答

0

根據錯誤信息,pk你給的{% url %}標籤的參數爲空:

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

有針對兩個常見的原因:

  1. 你有一個錯字你變量名稱在你的模板中。
  2. 你是創建一個新的對象,所以它還沒有ID/PK。

你的模板看起來不錯的,所以這裏是我會怎樣調試它:

  1. 刪除{% url %}標籤一個接一個,直到找到實際的罪魁禍首。
  2. 打印出您作爲關鍵字參數pk傳遞的變量。

還有一件事:\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 %} 
    
+0

感謝您的幫助。一些錯別字和問題解決了。感謝幫助! – Jcb1125

+0

很高興能幫到你!如果你的問題解決了,我會很高興你接受我的回答:) –