как сделать запрос на получение сообщений, отфильтрованных по той же категории в функциональном представлении django - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь перечислить все посты с той же категорией на моей домашней странице в django. Я хочу, чтобы заголовок был заголовком категории, а затем под заголовком должны отображаться все сообщения, относящиеся к этой категории. Я сделал это в представлении на основе классов, найдя справку по stackoverflow, но я хочу знать это в функциональном представлении, чтобы понять это.

сообщений / models.py

from tinymce import HTMLField
from django.db import models
from django.contrib.auth import get_user_model
from slugger import AutoSlugField
from django.urls import reverse
# Create your models here.
User = get_user_model()


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


class Author(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.user.username

class Category(models.Model):
    title = models.CharField(max_length=20)
    slug = AutoSlugField(populate_from='title')
    def __str__(self):
        return self.title


class Post(models.Model):
    title = models.CharField(max_length = 100)
    slug = AutoSlugField(populate_from='title')
    overview = models.CharField(max_length= 200)
    timestamp = models.DateTimeField(auto_now_add=True)
    content = HTMLField()
    comment_count = models.IntegerField(default=0)
    view_count = models.IntegerField(default=0)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    thumbnail = models.ImageField(
        upload_to=upload_location,
        null=True, 
        blank=True)
    category = models.ManyToManyField(Category)
    featured = models.BooleanField()
    previous_post = models.ForeignKey('self', related_name= 'previous', on_delete=models.SET_NULL, blank=True, null=True)
    next_post = models.ForeignKey('self', related_name= 'next', on_delete=models.SET_NULL, blank=True, null=True)

    def __str__(self):
        return self.title

posts / views.py Я пытался сделать это, но это выдает мне ошибку примерно так

TypeError at / index () отсутствует 1 обязательный позиционный аргумент: 'category_slug'

from django.shortcuts import render
from .models import Post, Author, Category
# Create your views here.
def index(request):
    featured = Post.objects.filter(featured = True)   #put this on carousel
    latest_post = Post.objects.order_by('-timestamp')[:6]
    category = Category.objects.filter(slug= category_slug)
    post_by_category = Post.objects.filter(category=category)
    context = {
        'object_list': featured,
        'latest_post': latest_post,
        'post_by_category': post_by_category,
    }
    return render(request, 'index.html', context)

urls.py

from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static
from django.conf import settings
from posts.views import index
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', index),
    path('tinymce/', include('tinymce.urls'))
]

if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Ответы [ 2 ]

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

Таким образом, это будет ваш URL, где вы получите слаг категории для фильтрации сообщений

path('<str:category_slug>', index)

Ваша функция запроса должна иметь параметр url в качестве аргумента, чтобы вы могли запрашивать категорию из БДв данном случае это category_slug

def index(request, category_slug):
    category = Category.objects.get(slug=category_slug)
    post_by_category = Post.objects.filter(category=category)

Помните, что filter () возвращает список экземпляров, поэтому используйте вместо него get ().

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

когда вы используете представление на основе функций, подобное вашему: def index(request, category_slug): вы объявляете query_param, и вы должны перехватить его в своем URL. Попробуйте это:

path('<str:category_slug>', index)

как ваше indexview

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