I'm trying to make a category in the DB, but when I try to access the category with the model that entered. it showing me this Error: ValueError at /category/Django/
Django is category I entered with the model I made using a ForeignKey.
I tried a different method for the category but it didn't work either. so I think the problem is in the db.sqlite3 file or in the migrations files. I can't delete the sql3 db file, I have data that I can't easy replaces. I don't think the problem is in the settings.py, I tried to change it before and got the same outcome.
the full Error:
\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'.
here is the views.py for the category
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,
}
the urls.py
from django.urls import path
from . import views
urlpatterns = [
path("category/<category>/", views.CatListView.as_view(), name="category"),
]
and for the category.html
{% for post in catlist.posts %}
{% endfor %}
Update:
models.py
from django.db import models
from django.contrib.auth.models import User
class Category(models.Model):
name = models.CharField(max_length=100)
class Meta:
ordering = ('name',)
verbose_name = 'category'
verbose_name_plural = 'categories'
def __str__(self):
return self.name
class Post(models.Model):
category = models.ForeignKey(Category, on_delete=models.PROTECT)
werkstoffnummer = models.CharField(max_length=100)
def __str__(self):
return self.werkstoffnummer
def get_absolute_url(self):
return reverse("post-detail", kwargs={"pk": self.pk})
CodePudding user response:
The Post.objects.filter(category__name=self.kwargs['category']) part alone is already filtering the posts based on the category from your key word arguments.
If you only want to filter posts with published category name only, you can category__name="Published".
Not entirely sure if that answers your question so comment if thats not it.
CodePudding user response:
Your problem is here:
.filter(category='published')
You are trying to filter a QuerySet of Post objects by category. But category is a ForeignKey field that accepts only id or Category objects. You are trying to pass there string - 'published'. It cannot be that way.
