Поле 'id' ожидало число, но получило 'category.id'

Я пытаюсь создать категорию в DB, но когда я пытаюсь получить доступ к категории с моделью, которую ввел. она показывает мне эту Error: ValueError at /category/Django/

Django - это категория, которую я ввел с помощью модели, которую я сделал, используя ForeignKey.

Я попробовал другой метод для категории, но он тоже не сработал. Так что я думаю, что проблема в файле db.sqlite3 или в файлах миграций. Я не могу удалить файл sql3 db, у меня есть данные, которые я не могу легко заменить. Я не думаю, что проблема в settings.py, я пытался изменить его раньше и получил тот же результат.

полная ошибка:

\Python39\site-packages\django\db\models\lookups.py", line 25, in __init__
    self.rhs = self.get_prep_lookup()
  File "C:\Users\HPi5\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\django\db\models\fields\related_lookups.py", line 117, in get_prep_lookup
    self.rhs = target_field.get_prep_value(self.rhs)
  File "C:\Users\HPi5\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\django\db\models\fields\__init__.py", line 1825, in get_prep_value
    raise e.__class__(
ValueError: Field 'id' expected a number but got 'published'.

Здесь находится views.py для категории

class CatListView(ListView):
    template_name = "Blog/category.html"
    context_object_name = 'catlist'

    def get_queryset(self):
        content = {
            'cat': self.kwargs['category'],
            'posts': Post.objects.filter(category__name=self.kwargs['category']).filter(category='published')
        }
        return content


def category_list(request):
    category_list = Category.objects.exclude(name='default')
    context = {
        "category_list": category_list,
    }

urls.py

from django.urls import path
from . import views

urlpatterns = [
 path("category/<category>/", views.CatListView.as_view(), name="category"),
]

и для category.html

{% for post in catlist.posts %}
{% endfor %}

Ваша проблема здесь:

.filter(category='published')

Вы пытаетесь filterперечислить QuerySet из Post объектов по category. Но category - это поле ForeignKey, которое принимает только id или Category объекты. Вы пытаетесь передать туда string - 'published'. Этого не может быть.

Одна только часть Post.objects.filter(category__name=self.kwargs['category']) уже фильтрует посты, основываясь на category из ваших аргументов ключевых слов. Если вы хотите отфильтровать только посты с published названием категории, вы можете category__name="Published".

Не совсем уверен, что это ответ на ваш вопрос, поэтому прокомментируйте, если это не так.

class CatListView(ListView):
    template_name = "Blog/category.html"
    context_object_name = 'catlist'
    ordering = ['-date_posted']
    paginate_by = 100

    def get_queryset(self):
        return Post.objects.filter(category__name=self.kwargs['category'])

    def get_context(self, **kwargs):
      context = super().get_context(**kwargs)
      paginator = self.get_paginator()
      context.update({
        'cat': self.kwargs['category'],
        'posts': paginator.get_page(self.kwargs[self.page_kwarg]).object_list,
      })
      return context
      

get_queryset будет фильтровать Post модели перед их постраничным размещением. Затем внутри get_context, paginator.get_page получит нужную страницу (на основе url-параметра self.page_kwarg, который по умолчанию имеет вид ?page=2), и обновит контекстный словарь последними результатами.

Для получения информации о методах представления, основанных на классах, я рекомендую вам посмотреть: https://ccbv.co.uk/

Вернуться на верх