/newspaperapp/category/sports/ 处的 ValueError:字段 'id' 需要一个数字,但得到了 'sports'

时间:2021-01-30 06:38:50

标签: django django-models django-views django-templates django-urls

我正在为新闻创建类别。我正在尝试明智地过滤新闻类别,但出现值错误 模型.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 中的代码,但它没有向我显示体育新闻,而只是打印了“体育类别”。

1 个答案:

答案 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})

我希望这对你有用。