无法使用get_queryset

时间:2018-04-22 20:26:39

标签: django django-templates django-views

对不起,这是基本的,但我是新来的

我试图从模板中的url(故事模型的主键)中获取捕获的组,然后使用它来过滤Post数据库中的正确帖子,它有一个(故事)到许多(邮政)关系。我基于文档的代码:https://docs.djangoproject.com/en/2.0/topics/class-based-views/generic-display/#dynamic-filtering

但是当我运行它时,我收到错误:

FieldError at /story/1/
Cannot resolve keyword 'name' into field. Choices are: body, id, title, work, work_id

我的代码:

#views
from django.shortcuts import get_object_or_404, render
from django.views.generic import ListView, DetailView

from . models import Post, Story

class StoryListView(ListView):
    model = Story
    template_name = 'home.html'

class PostListView(ListView):
    template_name = 'story_overview.html'

    def get_queryset(self):
        self.work_id=get_object_or_404(Post, name=self.kwargs['pk'])
        return Post.objects.filter(work_id=self.work_id)
#urls
from django.urls import path
from . import views

urlpatterns = [
    path('', views.StoryListView.as_view(), name='home'),
    path('story/<int:pk>/', views.PostListView.as_view(),   name='story_overview'),
]

#templates/home.html
{% extends 'base.html' %}

{% block content %}
{% for post in object_list %}
    <h2><a href="{% url 'story_overview' post.pk %}">{{ post.title }}</a></h2>
    <p>{{ post.description }}</p>
{% endfor %}
{% endblock content %} 

#models
from django.db import models

class Story(models.Model):
    title = models.CharField(max_length=200)
    description = models.CharField(max_length=1500, default= "Description")

    def __str__(self):
        return self.title


class Post(models.Model):
    title = models.CharField(max_length=200, default= "Title")
    work = models.ForeignKey(Story,on_delete=models.CASCADE,)
    body = models.TextField()

    def __str__(self):
        return self.title

2 个答案:

答案 0 :(得分:0)

您正在尝试使用名称字段从Post()模型获取对象。您的Post()模型中是否存在名称字段?

而不是这样做

self.work_id=get_object_or_404(Post, name=self.kwargs['pk']) 

这样做

self.work_id=get_object_or_404(Post, id=self.kwargs['pk'])

希望它有所帮助!

答案 1 :(得分:0)

如果使用work_id进行过滤,则应使用整数。

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

如果您想要抓取Story个实例,那么您应该使用get_object_or_404来呼叫Story,并过滤pk字段而不是name:< / p>

def get_queryset(self):
    self.work=get_object_or_404(Story, pk=self.kwargs['pk'])
    return Post.objects.filter(work=self.work)

注意我已将work_id重命名为work,因为它是模型实例,而不是ID。