无法将关键字 u'slug' 解析为 Django 中的字段错误?

Posted

技术标签:

【中文标题】无法将关键字 u\'slug\' 解析为 Django 中的字段错误?【英文标题】:Cannot resolve keyword u'slug' into field error in Django?无法将关键字 u'slug' 解析为 Django 中的字段错误? 【发布时间】:2014-07-04 14:47:44 【问题描述】:

我收到以下错误:

FieldError at /blog/1/first-post/

Cannot resolve keyword u'slug' into field. Choices are: article, date, id, likes

Request Method:     GET
Request URL:    http://127.0.0.1:8000/blog/1/first-post/
Django Version:     1.6.2
Exception Type:     FieldError
Exception Value:    

Cannot resolve keyword u'slug' into field. Choices are: article, date, id, likes

我的模特:

class Article(models.Model):
    title = models.CharField(max_length=20)
    body = models.TextField()
    image = models.ImageField(upload_to="/", blank=True, null=True)
    slug = models.SlugField()

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(self.title)
        super(Article, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('article_detail', kwargs='slug':self.slug, 'id':self.id)

    def __unicode__(self):
        return self.title

class Detail(models.Model):
    article = models.ForeignKey(Article)
    date = models.DateField()
    likes = models.IntegerField()

    def __unicode__(self):
        return "%s %s" % (self.article.title, self.likes)

    def get_absolute_url(self):
        return reverse('detail_article', kwargs='id':self.id)

查看:

class ArticleDetail(DetailView):
     model = Detail
     template_name = "article_detail.html"
     context_object_name = "details"

     def get_queryset(self):
        print self.kwargs['slug']
        a = Article.objects.get(slug=self.kwargs['slug'])
        # print Details.object.get()
        # print Detail.objects.filter(article__slug=self.kwargs['slug']) fails with same error
        return Detail.objects.filter(article=a)

urls.py(这是博客应用程序内部的):

urlpatterns = patterns('',

url(r'all$', ArticleList.as_view(), name='blog_all'),
url(r'^(?P<id>\d+)/(?P<slug>[-\w\d]+)/$', ArticleDetail.as_view(), name='article_detail'),
url(r'^detail/?(P<id?\d+)/$', DetailArticle.as_view(), name='detail_article'),
url(r'^create$', ArticleCreateView.as_view(), name='blog_create'),
)

基本上article instance 的detailView 将显示与article model 具有外键关系的detail 模型的内容。这不是article 实例的详细视图显示该实例的传统方式。

此处为模板:

% extends "base.html" %
% block content %
% for detail in details %
<p> detail.article.title </p>
<p> detail.date </p>
<p> detail.likes </p>
% endfor %
% endblock %

【问题讨论】:

您的数据库中是否存在字段“slug”? @zymud:是的,它适用于article 模型。我可以在管理员中看到它并在 shell 中查询 请出示您的模板 @zymud: 上面添加的模板 【参考方案1】:

覆盖get_object(self, queryset=None) 方法而不是DetailView get_queryset(self) 是一种更简单的解决方案

class ArticleDetail(DetailView):
    model = Detail
    template_name = "article_detail.html"
    context_object_name = "details"

    def get_object(self, queryset=None):
        slug = self.kwargs['slug']
        a_obj = Article.objects.get(slug=slug)
        try:
           d_obj = Detail.objects.get(article=a_obj)
        except Detail.DoesNotExist:
            d_obj = None
        except Detail.MultipleObjectsReturned:
            #select the apt object
        return d_obj

【讨论】:

你需要设置d_obj=None并且你需要在return d_obj上放一个tab【参考方案2】:

解决方案:您需要将 url 中的 slug 参数重命名为其他名称,或者在您的视图中设置 slug_url_kwarg 其他值 - 而不是“slug”

说明: 当您添加到 url 时,django 会尝试通过 slug 获取对象,并且您的模型 Detail 没有 slug 字段。

django 代码链接:https://github.com/django/django/blob/master/django/views/generic/detail.py#L33

更新

在 SingleObjectMixin 中:

slug = self.kwargs.get(self.slug_url_kwarg, None)
...
elif slug is not None:
    slug_field = self.get_slug_field()
    queryset = queryset.filter(**slug_field: slug)

所以 django 从您的 url 获取 slug,尝试从 Detail 模型获取 slug 字段并失败

你的视图需要重写 slug_url_kwarg 属性:

class ArticleDetail(DetailView):
    model = Detail
    template_name = "article_detail.html"
    context_object_name = "details"
    slug_url_kwarg = "not_slug" # this attribute

 def get_queryset(self):
    print self.kwargs['slug']
    a = Article.objects.get(slug=self.kwargs['slug'])
    # print Details.object.get()
    # print Detail.objects.filter(article__slug=self.kwargs['slug']) fails with same error
    return Detail.objects.filter(article=a)

但我认为更好的方法是在你的 url 中更改属性:

url(r'^(?P<id>\d+)/(?P<article_slug>[-\w\d]+)/$', ArticleDetail.as_view(), name='article_detail'),

并从视图 kwargs 中获取 article_slug

【讨论】:

您能否详细说明“在您的视图中设置 slug_url_kwarg 其他值 - 不是 slug”的含义,请尽可能通过代码示例给出

以上是关于无法将关键字 u'slug' 解析为 Django 中的字段错误?的主要内容,如果未能解决你的问题,请参考以下文章

无法将关键字'user'解析为字段-Django错误

如何修复:无法将关键字“用户”解析为字段。选项有:description、end_time、id、start_time、title Django 错误

字段错误在/。无法将关键字“textField”解析为字段

无法将关键字“用户名”解析为字段。选项有:地址、年龄、城市、国家、性别、姓名、电话、pt_id、用户、user_id

Django加入 - 我需要父母和子桌的所有领域

无法将关键字“用户”解析为字段。选项有:create_account、email、full_name