Поле '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/