【问题标题】:How to add categories at my django blog如何在我的 django 博客中添加类别
【发布时间】:2016-10-27 17:37:17
【问题描述】:

我使用 djangogirls.com 教程开发了一个 django 博客应用程序。我正在尝试添加博客类别,但我做不到!

我正在疯狂地搜索 google 和 stackoverflow.com,但是,作为 python/django 的新手,我无法成功地将类别添加到我的博客中。

我的模型:

from django.db import models
from django.utils import timezone 

class Post(models.Model):
    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
          default=timezone.now)
    published_date = models.DateTimeField(
          blank=True, null=True)

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

def __str__(self):
    return self.title

我的看法:

from django.shortcuts import render, get_object_or_404
from django.utils import timezone
from .models import Post

def post_list(request):
posts =  Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
return render(request, 'blog/post_list.html', {'posts': posts})

def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    return render(request, 'blog/post_detail.html', {'post': post})

我的网址:

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

urlpatterns = [
    url(r'^$', views.post_list, name='post_list'),
    url(r'^post/(?P<pk>\d+)/$', views.post_detail, name='post_detail'),
]

我的 post_list.html: {% 扩展 'blog/base.html' %}

 {% block content %}
   {% for post in posts %}
      <div class="post">
          <div class="date">
              {{ post.published_date }}
          </div>
              <h1><a href="{% url 'post_detail' pk=post.pk %}">{{post.title }}</a></h1>
        <p>{{ post.text|truncatewords:100}}</p>
    </div>
  {% endfor %}
{% endblock %}

我的 post_detail.html:

{% extends 'blog/base.html' %}

{% block content %}
    <div class="post">
       {% if post.published_date %}
           <div class="date">
              {{ post.published_date }}
           </div>
      {% endif %}
      <h1>{{ post.title }}</h1>
    <p>{{ post.text|linebreaks }}</p>
 </div>
{% endblock %}

好的。如果有人可以帮助我,我需要为此博客模型创建一个类别模型,我将不胜感激! 提前致谢!

【问题讨论】:

    标签: django python-3.x django-models django-apps


    【解决方案1】:

    我会去的

    class Category(models.Model):
        title = models.CharField(max_length=255, verbose_name="Title")
        ...
    
    
    class Post(models.Model):
        category = models.ForeignKey(Category, verbose_name="Category")
        title = models.CharField(max_length=255, verbose_name="Title")
        text = models.TextField()
        ...
    

    当你有这样的帖子时:

    post = Post.objects.first()
    

    您可以使用post.category.title 访问它的类别标题,或者当您有这样的类别时:

    category = Category.objects.first()
    

    您可以使用category.post_set.all() 获取该类别下的帖子。


    我已经编辑了您的代码,以展示如果这是我正在从事的项目,我会如何编写。这里是:

    models.py

    from django.db import models
    from django.utils import timezone 
    
    class Category(models.Model):
        created_at = models.DateTimeField(auto_now_add=True, verbose_name="Created at")
        updated_at = models.DateTimeField(auto_now=True, verbose_name="Updated at")
        title = models.CharField(max_length=255, verbose_name="Title")
    
        class Meta:
            verbose_name = "Category"
            verbose_name_plural = "Categories"
            ordering = ['title']
    
        def __str__(self):
            return self.title
    
    class Post(models.Model):
        created_at = models.DateTimeField(auto_now_add=True, verbose_name="Created at")
        updated_at = models.DateTimeField(auto_now=True, verbose_name="Updated at")
        is_published = models.BooleanField(default=False, verbose_name="Is published?")
        published_at = models.DateTimeField(null=True, blank=True, editable=False, verbose_name="Published at")
        category = models.ForeignKey(Category, verbose_name="Category")
        author = models.ForeignKey('auth.User', verbose_name="Author")
        title = models.CharField(max_length=200, verbose_name="Title")
        text = models.TextField(verbose_name="Text")
    
        class Meta:
            verbose_name = "Post"
            verbose_name_plural = "Posts"
            ordering = ['-created_at']
    
        def publish(self):
            self.is_published = True
            self.published_at = timezone.now()
            self.save()
    
        def __str__(self):
            return self.title
    

    views.py

    from django.shortcuts import render, get_object_or_404
    from django.utils import timezone
    from .models import Category, Post
    
    def category_list(request):
        categories = Category.objects.all() # this will get all categories, you can do some filtering if you need (e.g. excluding categories without posts in it)
    
        return render (request, 'blog/category_list.html', {'categories': categories}) # blog/category_list.html should be the template that categories are listed.
    
    def category_detail(request, pk):
        category = get_object_or_404(Category, pk=pk)
    
        return render(request, 'blog/category_detail.html', {'category': category}) # in this template, you will have access to category and posts under that category by (category.post_set).
    
    def post_list(request):
        posts =  Post.objects.filter(published_at__lte=timezone.now()).order_by('published_at')
    
        return render(request, 'blog/post_list.html', {'posts': posts})
    
    def post_detail(request, pk):
        post = get_object_or_404(Post, pk=pk)
    
        return render(request, 'blog/post_detail.html', {'post': post})
    

    urls.py

    from django.conf.urls import include, url
    from . import views
    
    urlpatterns = [
        url(r'^category$', views.category_list, name='category_list'),
        url(r'^category/(?P<pk>\d+)/$', views.category_detail, name='category_detail'),
        url(r'^$', views.post_list, name='post_list'),
        url(r'^post/(?P<pk>\d+)/$', views.post_detail, name='post_detail'),
    ]
    

    我没有写模板,它们取决于你。

    【讨论】:

    • urls.py 和 views.py 应该是什么样子?
    • 太棒了!非常感谢您分享您的知识。我遵循了您的回答,并且能够在我的 /admin 中创建一个类别,但是现在我不知道如何将其添加到模板中,问您是否也可以帮我解决这些问题,我感到很愚蠢。非常感谢!
    • 对不起,我没有时间帮你创建模板。基本上,您需要创建 blog/category_list.html 和 blog/category_detail.html` 并将要显示的 HTML 放入其中。试试自己,如果你遇到困难,也许我或其他人可以提供帮助。
    【解决方案2】:

    其实这个方法(发布)只是Django Girls教程需要的,在shell中玩https://tutorial.djangogirls.org/en/django_orm/

    def publish(self):
        self.is_published = True
        self.published_at = timezone.now()
        self.save()
    

    由于操作由 django 管理员管理,我会更改

    published_at = models.DateTimeField(null=True, blank=True, editable=False, verbose_name="Published at")
    

    published_at = models.DateTimeField(null=True, blank=True, editable=True, default=timezone.now, verbose_name="Published at")
    

    因此,当添加新帖子时,它将设置默认时间,您可以将其更改为适合您的任何时间。

    【讨论】:

      猜你喜欢
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      相关资源
      最近更新 更多