easy_c0mpany80
easy_c0mpany80

Reputation: 337

Confused by Django 404s for simple pages

Im doing my first Django site myself after going through several tutorials and running into some errors that I can't figure out what the problem is as they are simple page requests.

I was trying to make a category detail view e.g. 127.0.0.1:8000/news and Ive followed the same setup as other pages such as the index and post detail which have worked fine but this is giving a 404.

here are my files

models.py 

from django.db import models
from django.core.urlresolvers import reverse

class EntryQuerySet(models.QuerySet):
    def published(self):
        return self.filter(publish=True)

class Blog(models.Model):
    title = models.CharField(max_length = 200)
    slug = models.SlugField(max_length = 100, db_index = True)
    body = models.TextField()
    publish = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    category = models.ForeignKey('blog.category')

objects = EntryQuerySet.as_manager()


    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('post_detail', kwargs={'slug':self.slug})


    class Meta:
        verbose_name = 'Blog entry'
        verbose_name_plural = 'Blog entries'
        ordering = ['-created']

class Category(models.Model):
    cat_title = models.CharField(max_length = 200, db_index = True)
    cat_slug = models.SlugField(max_length = 100, db_index = True)


    def __str__(self):
        return self.cat_title

    def get_absolute_url(self):
        return reverse('category_detail', kwargs={'cat_slug':self.cat_slug})

    class Meta:
        verbose_name = 'Category'
        verbose_name_plural = 'Categories'

views.py

from django.views import generic
from . import models


class index_view(generic.ListView):
    queryset = models.Blog.objects.published()
    template_name = 'index.html'

class post_view(generic.DetailView):
    model = models.Blog
    template_name = 'post_view.html'

class category_view(generic.ListView):
    model = models.Category
    template_name = 'category_view.html'

class category_detail_view(generic.DetailView):
    model = models.Category
    template_name = 'category_detail_view.html'

class About_page(generic.DetailView):
    template_name = 'about.html'

app urls.py

from django.conf.urls import url
from django.contrib import admin
from . import views



urlpatterns = [

    url(r'^$', views.index_view.as_view(), name='index'),
    url(r'^categories/$', views.category_view.as_view(), name='category_detail'),
    url(r'^(?P<slug>\S+)$', views.post_view.as_view(), name='post_detail'),
    url(r'^(?P<cat_slug>\S+)$', views.category_detail_view.as_view(), name='category_detail_view'),
   url(r'^about/$', views.About_page.as_view(), name='about'),

this is the category detail page 'category_detail_view.html'

{% extends 'base.html' %}

{% block title %} The category detail view page {% endblock %}

{% block category_detail %}
    {% for cat_title in object_list %}
        <ul>
            <li>{{ category.cat_title }}</li>

    {% endfor %}
        </ul>

{% endblock %}

and the about page

{% extends 'base.html' %}

<h2>This is the about page</h2>

both of these pages return this error message

Page not found (404) Request Method: GET Request URL: http://127.0.0.1:8000/about/ Raised by: blog.views.post_view No Blog entry found matching the query

I dont understand why 'blog.post_view' is being raised when neither of these templates refer to the post_view.

I have an index page with all published posts listed, a categories page with all categories listed and a post detail page all of which work fine and are almost exactly the same as these views and templates.

Upvotes: 0

Views: 84

Answers (1)

Alasdair
Alasdair

Reputation: 309109

When Django resolves the url /about/, it goes through your url patterns in order. It matches the post_detail url pattern, so runs the post_view, treating about as a slug. Since you don't have any posts with the slug about, you get the 404 error.

One solution is to move the about url pattern above the post_detail pattern. You should also change the category url pattern, otherwise it won't work. For example, you could do:

url(r'^about/$', views.About_page.as_view(), name='about'),
url(r'^(?P<slug>\S+)$', views.post_view.as_view(), name='post_detail'),
url(r'^categories/(?P<cat_slug>\S+)$', views.category_detail_view.as_view(), name='category_detail_view'),

Upvotes: 6

Related Questions