如何在基于函数的视图中按类别在django中查询帖子

时间:2019-03-09 08:51:32

标签: python django

我有一个职位和类别模型。在这里,我想按类别列出帖子。类别名称将是页面的标题,并且具有相同类别的帖子将在此下方呈现。 而且我不知道该怎么做。

  

这是我的模特

from django.db import models
from django.utils import timezone
from slugger import AutoSlugField
from django.contrib.auth.models import User
from django.urls import reverse
# Create your models here.

def upload_location(instance, filename):
    return "%s/%s" %(instance.slug, filename)

class Category(models.Model):
    title = models.CharField(max_length= 60)
    slug = AutoSlugField(populate_from='title')
    parent = models.ForeignKey('self',blank=True, null=True ,related_name='children',on_delete=models.CASCADE)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)

    class Meta:
        verbose_name_plural = 'categories'
    def __unicode__(self):
        return self.title

    def __str__(self):
        return self.title



class Post(models.Model):
    title = models.CharField(max_length=120)
    slug = AutoSlugField(populate_from='title')
    image = models.ImageField(
        upload_to=upload_location,
        null=True, 
        blank=True,
    )
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    content = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)


    def __str__(self):
        return self.title


    def get_absolute_url(self, slug=None):
        return reverse("posts-detail", kwargs={"slug": self.slug})
  

post / view.py

def posts_list(request):
    post = Post.objects.all()
    category = Category.objects.all()
    context = {
        'post': post,
        'category': category,
        'title': 'Post list'
    }
    return render(request, 'posts/home.html', context)

2 个答案:

答案 0 :(得分:2)

您需要添加的第一件事是模型外键中的related_name

class Post(models.Model):
     category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='postcategory')

然后,您需要在同一视图中添加多个类别。您可以使用简单的查询集或使用get_context_data添加它,

class HomeView(ListView):
    template_name = 'home.html'
    model = Category
    context_object_name = 'all_categs'

    def get_queryset(self):
       return Category.objects.all()

    def get_context_data(self):
        context = super(HomeView, self).get_context_data()
        context['latest_posts'] = Post.objects.order_by('-date_posted')[0:3] #or simply [:3]
        # This will show your 3 latest posts you can add accordingly
        return context

    def get_success_url(self):
       return reverse('home') #add your path

在HTML中,您需要显示它

{% for post in latest_posts %}
    <p>{{post.title}}</p>
    #other attributes
{% endfor %}

{% for ct in all_categs %}
<div>
    <div> {{ct.title}} </div>
    {% for post in ct.postcategory.all|dictsortreversed:"date_posted" %}
       <p> {{post.title}} </p>
       # add other fields
    {% endfor %}
 </div>
{% endfor %}

现在由您决定如何渲染前端视图。我尚未测试此代码,如果您发现任何错误,请让我知道或在SO中找到答案,

  

注意-Django Queryset是惰性的,因此,如果您有很多类别,则此   会减慢页面加载时间。因此,请确保您改善了   具有缓存和其他功能的页面速度。

Edit-1:要显示两个模型属性时,可以使用get_context_data。如果要添加表单,也可以用类似的方法添加。

答案 1 :(得分:0)

如果您想在管理站点中使用此功能,则可以改写最初属于formfield_for_foreignkey的{​​{1}}方法。

访问https://docs.djangoproject.com/en/2.1/ref/contrib/admin/

并参见admin.ModelAdmin部分