簡體   English   中英

如何在基於函數的視圖中按類別在django中查詢帖子

[英]how to query posts by category in django in function based view

我有一個職位和類別模型。 在這里,我想按類別列出帖子。 類別名稱將是頁面的標題,並且具有相同類別的帖子將在此下方呈現。 而且我不知道該怎么做。

這是我的模特

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)

您需要添加的第一件事是模型外鍵中的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是惰性的,因此,如果您有很多類別,這會減慢頁面加載時間。 因此,請確保通過緩存和其他方法提高頁面速度。

編輯1:當要顯示兩個模型屬性時,可以使用get_context_data。 如果要添加表格,也可以用類似的方法添加。

如果你想在你的管理網站這個功能,那么你可以overreide formfield_for_foreignkey原本屬於法admin.ModelAdmin

訪問https://docs.djangoproject.com/en/2.1/ref/contrib/admin/

並參見ModelAdmin.formfield_for_foreignkey(db_field, request, **kwargs)部分

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM