我正在为新闻创建类别。我正在尝试明智地过滤新闻类别,但出现值错误 模型.py
class category(models.Model):
title = models.CharField(max_length=199)
category_image = models.ImageField(upload_to="imgs")
def __str__(self):
return self.title
class newsmodel_0(models.Model):
category = models.ForeignKey(category, on_delete=models.CASCADE)
title = models.CharField(max_length=49, null=False, blank=False)
date_published = models.DateTimeField(auto_now_add=True)
# details = models.TextField()
details = RichTextUploadingField(blank=True, null=True)
slug = models.SlugField(blank=True, unique=True)
def slug(self):
return slugify(self.date_published)
这是views.py
def index(request):
cats = category.objects.all()
return render(request, 'newspaperapp/index.html', {'cats': cats})
class nowlist(ListView):
model = newsmodel_1
template_name = 'newspaperapp/index.html'
class newslist(DetailView):
model = newsmodel_1
template_name = 'newspaperapp/home.html'
context_object_name = 'newspaperapp'
class SearchView(ListView):
model = newsmodel_1
template_name = 'newspaperapp/search.html'
context_object_name = 'all_search_results'
def get_queryset(self):
result = super(SearchView, self).get_queryset()
query = self.request.GET.get('search')
# query is of type 'str', convert to datetime
start_day = datetime.fromisoformat(query)
end_day = start_day + timedelta(days=1)
if query:
postresult = newsmodel_1.objects.filter(
date_published__gte=start_day,
date_published__lt=end_day
)
result = postresult
else:
result = None
return result
def full_news(request):
return render(request, 'newspaperapp/full-news.html')
def CategoryView(request, cats):
category_posts = newsmodel_1.objects.filter(category=cats)
return render(request, "newspaperapp/categories.html", {'cats': cats, 'category_posts': category_posts})
这是 urls.py
urlpatterns = [
path('',views.index,name='index'),
path('date/',nowlist.as_view(),name = "date"),
path('<int:pk>',newslist.as_view(),name = "home"),
path('results/', SearchView.as_view(), name='search'),
path('full_news/',views.full_news,name = "full_news"),
path('category/<str:cats>/',views.CategoryView,name='category'),
]
categories.html
<h1>{{cats}} category</h1>
<ul>
{%for post in category_posts%}
<h3><a href="{%url 'newspaperapp:index' %}">{{ newspaperapp.title}}
{{newspaperapp.category}}</a></h3>
{% endfor %}
index.html
{% for cat in cats %}
<p class="card-text"><a href="category/{{cat.id}}" class="btn btn-sm btn-primary">{{cat.title}}
</a></p>
{% endfor %}
如果我使用 #category_posts = newsmodel_1.objects.filter(category__name = cat) 那么我在 /newspaperapp/category/sports/ 处收到错误 FieldError 相关字段查找无效:名称
我已经更改了 catogories.html 中的代码,但它没有向我显示体育新闻,而只是打印了“体育类别”。
答案 0 :(得分:1)
在您的 CategoryView
中而不是使用这个:
def CategoryView(request, cats):
category_posts = newsmodel_1.objects.filter(category=cats)
return render(request, "newspaperapp/categories.html", {'cats': cats, 'category_posts': category_posts})
试试这个:
def CategoryView(request, cats):
cats = Category.objects.get(title=cats) # this will give the Category instance instead of string cats
category_posts = newsmodel_1.objects.filter(category=cats)
return render(request, "newspaperapp/categories.html", {'cats': cats, 'category_posts': category_posts})
我希望这对你有用。