2017-03-13 49 views
0

我想建立一個'列表'視圖,其中將顯示數據庫中的所有圖像。 這是模板:Django 1.10 NoReverseMatch - 退出但不匹配?

{% extends "base.html" %} 
{% block title %}Your images{% endblock %} 
{% block content %} 
    <ul> 
     {% for picture in images %} 

      <a href="{% url "detail" id=picture.id slug=picture.slug %}"> 
      <img src="{{ picture.image.url }}" class="image-detail"> 
      </a> 

     {% endfor %} 
    </ul> 

{% endblock %} 

而且列表和詳細信息的網址:

url(r'^detail/(?P<id>\d+)/(?P<slug>[\w]+)/$',views.image_detail,name='detail')

url(r'^list/$', views.image_list, name='list')

當用戶點擊圖片,他應該被重定向到該頁面「詳細'的觀點。

def image_detail(request, id, slug): 
    image = get_object_or_404(Image, id=id, slug=slug) 
    return render(request, 
    'images/image/detail.html', 
    {'section': 'images', 
    'image': image}) 

def image_list(request): 
    images = Image.objects.all() 
    return render(request,'images/image/list.html',{'images':images}) 

可以看出,'detail'視圖有2個參數:id和slug。 在上面的模板中,我得到了相應圖片的id和slug的參數(id=picture.id slug=picture.slug)。 後,我沒有運行服務器,當我試圖訪問列表頁上我的網站,

我得到了一個「NoReverseMatch」錯誤: 異常值:反轉「細節」與參數「()」和關鍵字參數'{​​'id':1,'slug':'django-and-duke'}'找不到。嘗試了0個模式:[]

我啓動了shell,導入了Image模型,並且想檢查是否確實沒有任何具有該id和slug的圖像。

>>> Image.objects.get(id=1,slug='django-and-duke') 
<Image: Django and Duke> 

所以實際上有一個圖像對象與請求的ID和slu ... ......發生了什麼事?

編輯:圖像模式:

class Image(models.Model): 

    user = models.ForeignKey(settings.AUTH_USER_MODEL, 
             related_name='images_created') 

    title = models.CharField(max_length=200) 
    slug = models.SlugField(max_length=200, 
            blank=True) 

    users_like = models.ManyToManyField(settings.AUTH_USER_MODEL, 
            related_name='images_liked', 
            blank=True) 

    image = models.ImageField(upload_to='images',blank=True) 

    description = models.TextField(blank=True) 

    created = models.DateField(auto_now_add=True, db_index=True) 

    objects = models.Manager() # The default manager. 
    published = PublishedManager() # Our custom manager. 

    def __str__(self): 
     return self.title 

    def save(self, *args, **kwargs): 
     if not self.slug: 
      self.slug = slugify(self.title) 
      super(Image, self).save(*args, **kwargs) 

    def get_absolute_url(self): 
     return reverse('images:detail', args=[self.id, self.slug])` 
+0

哪個網址。py是那些模式?如果他們不在主項目的urls.py中,那麼你如何包含它們? – Alasdair

+1

該錯誤並不表示該項目不存在,它表示無法找到您的URL模式。 –

+0

發佈你的模型,有沒有在那裏定義的'get_absolute_url'方法? –

回答

2

您是namespacing的URL。因此,這將是類似的東西:

<a href="{% url 'images:detail' id=picture.id slug=picture.slug %}"> 

在你的根urls.py你可能有這樣的事情:

urlpatterns = [ 
    ... 
    url(r'^', include('images.urls', namespace='images')) 
] 

有些修改-想法:

  1. id=slug=部分在{% url %}內不是必需的。它沒有它們。但是顯式優於隱式,對嗎?

  2. 當一個錯誤:發生Exception Value: Reverse for '<view_name>' with arguments '('arg1', ...)' and keyword arguments '{'key1': kayvalue1, ...}' not found. 0 pattern(s) tried:[],然後99時代%發現url pattern(使用正確ARGS或/和kwargs),但namespace缺失。解決方案:{% url 'namespace:view_name' args/kwrags here %}

  3. 當一個錯誤:Exception Value: Reverse for '<view_name>' with arguments '()' and keyword arguments '{}' not found. 0 pattern(s) tried:[]發生時,然後99倍url pattern的%發現但ARGS或/和kwargs沒有被認可。解決方案:更好地檢查您的聲明/語法urls

+0

感謝您的快速回答!很棒! – ROBlackSnail