简体   繁体   中英

Django One to Many relationship urls

I use to django for my web site. But ı have a question about blog/urls.py(my app name is blog )

I use to with one to many releationship in blog/models.py.

Category (1 => *) Subject (1 => *) Article.

class Category(models.Model):
    name = models.CharField(max_length=200)
    statement = models.TextField()
    slug=models.SlugField()

    page_name = models.ForeignKey('Page', on_delete=models.CASCADE)

    def __str__(self):
        return self.name


class Subject(models.Model):
    name = models.CharField(max_length=200)
    statement = models.TextField()
    slug=models.SlugField()

    category_name = models.ForeignKey('Category', on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class Article(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    slug=models.SlugField()
    text = models.TextField()
    created_date = models.DateTimeField(
        default=timezone.now)
    published_date = models.DateTimeField(
        blank=True, null=True)
    subject_name = models.ForeignKey('Subject', on_delete=models.CASCADE)


    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('blog:detail', kwargs={'id' : self.id})

blog/views.py

def detail(request,article_slug):
article = get_object_or_404(Article, slug=article_slug)
article_list=Article.objects .all()
subject_list = Subject.objects.all()
context={
    'article': article,

    'article_list':article_list,
    'subject_list': subject_list
}

return render(request, 'blog/detail.html', context)

blog/urls.py

url(r'^(?P<category_slug>[\w-]+)/(?P<subject_slug>[\w-]+)/(?P<article_slug>[\w-]+)/$', views.detail, name='detail'),

I want to see the url when I click on the links of my article

http://127.0.0.1:8000/myworkandresearch/category_slug/subject_slug/article_slug

blog / urls.py 'How can I edit?

I think you should have a detail view as

def detail(request, category_slug, subject_slug, article_slug):
    article = Article.objects.filter(
        slug = article_slug,
        subject__slug = subject_slug,
        subject__category__slug = category_slug
    )
    return render(request, 'blog/detail.html', {'article': article})

You need the following method on your article model

def get_absolute_url(self):
    return reverse('detail', args=[self.slug, self.subject.slug, self.subject.category.slug])

When displaying your articles

<a href="{{article.get_absolute_url}}">{{article.title}}</a>

Your url might look like this

url(r'^myworkandreseach/(?P<category_slug>[\w-]+)/(?P<subject_slug>[\w-]+)/(?P<article_slug>[\w-]+)/$', views.detail, name='detail'),

Be sure to import views

edit my blog/models.py

class Article(models.Model):
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
title = models.CharField(max_length=200)
slug=models.SlugField()
text = models.TextField()
created_date = models.DateTimeField(
    default=timezone.now)
published_date = models.DateTimeField(
    blank=True, null=True)
subject_name = models.ForeignKey('Subject', on_delete=models.CASCADE)


def publish(self):
    self.published_date = timezone.now()
    self.save()

def __str__(self):
    return self.title

def get_absolute_url(self):
     return reverse('blog:detail', args=[self.slug, self.subject.slug, self.subject.category.slug])

blog/views.py

def detail(request, category_slug, subject_slug, article_slug):
article = Article.objects.filter(
    slug = article_slug,
    subject__slug = subject_slug,
    subject__category__slug = category_slug
)

subject_list = Subject.objects.all()
category_list = Category.objects.all()

context = {
    'category_list': category_list,
    'subject_list': subject_list,
    'article': article
}
return render(request, 'blog/detail.html', context)

blog/urls.py

    from django.conf.urls import include, url
from . import views

app_name = 'blog'
urlpatterns = [
    url(r'^$', views.myworkandresearch, name='myworkandresearch'),
    url(r'(?P<category_slug>[\w-]+)/$', views.subjects, name='subjects'),
    url(r'^(?P<category_slug>[\w-]+)/(?P<subject_slug>[\w-]+)/(?P<article_slug>[\w-]+)/$', views.detail, name='detail'),
]

subjects.html

{% for article in subject.article_set.all %}}
                <ul class="sidebar-items">
                  <li><a href="{{article.get_absolute_url}}">{{article.title}}</a></li>
                </ul>
                {% endfor %}

[error continues.][2]

Page not found (404) Request Method: GET Request URL: http://127.0.0.1:8000/myworkandresearch/machine_learning/python_dictionary/numpy/ Raised by: blog.views.subjects No Category matches the given query.

You're seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM