我有一个职位和类别模型。在这里,我想按类别列出帖子。类别名称将是页面的标题,并且具有相同类别的帖子将在此下方呈现。 而且我不知道该怎么做。
这是我的模特
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)
答案 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
部分