как запросить посты по категориям в Django в представлении на основе функций - PullRequest
0 голосов
/ 09 марта 2019

У меня есть модель поста и категории. Здесь я хочу перечислить сообщения по категориям. Название категории будет заголовком страницы, и пост с той же категорией будет отображаться под этим. И я понятия не имею, как это сделать.

Это моя модель

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})

сообщение / 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 ]

2 голосов
/ 09 марта 2019

Первое, что вам нужно добавить, это 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 - Lazy, поэтому, если у вас много категорий, это может замедлить время загрузки вашей страницы. Поэтому убедитесь, что вы улучшаете скорость страницы с кешированием и прочим.

Edit-1: когда вы хотите показать два атрибута модели, вы можете использовать get_context_data. Если вы хотите добавить форму, вы можете добавить аналогичным образом.

0 голосов
/ 09 марта 2019

Если вы хотите использовать эту функцию на своем сайте администратора, вы можете переопределить метод formfield_for_foreignkey, который изначально принадлежит admin.ModelAdmin.

Посетите https://docs.djangoproject.com/en/2.1/ref/contrib/admin/

и посмотрите ModelAdmin.formfield_for_foreignkey(db_field, request, **kwargs) раздел

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...