【问题标题】:Error searching in Django admin在 Django 管理员中搜索时出错
【发布时间】:2017-08-21 00:39:27
【问题描述】:

这是我的代码的相关部分:

模型.py

class Blogger(models.Model):
    identity = models.ForeignKey(User, models.SET_NULL, null=True)

    def __str__(self):
        return self.identity.username

我希望能够使用他们的blogger_instance.identity.username 搜索博主,所以我做到了:

admin.py

@admin.register(Blogger)
class BloggerAdmin(admin.ModelAdmin):
    list_display = ('__str__', 'identity')
    search_fields = ['__str__']

我去了http://127.0.0.1:8000/admin/blog/blogger/,在搜索栏输入user,点击Search,得到一个FieldError

FieldError at /admin/blog/blogger/
Cannot resolve keyword '' into field. Choices are: bio, blog, comment, id, identity, identity_id
Request Method: GET
Request URL:    http://127.0.0.1:8000/admin/blog/blogger/?q=user
Django Version: 1.10.6
Exception Type: FieldError
Exception Value:    
Cannot resolve keyword '' into field. Choices are: bio, blog, comment, id, identity, identity_id
Exception Location: /Users/sunqingyao/Envs/django_test/lib/python3.6/site-packages/django/db/models/sql/query.py
in names_to_path, line 1327
Python Executable:  /Users/sunqingyao/Envs/django_test/bin/python
Python Version: 3.6.0
Python Path:    
['/Users/sunqingyao/PycharmProjects/diyblog',
 '/Users/sunqingyao/PycharmProjects/diyblog',
 '/Users/sunqingyao/Envs/django_test/lib/python36.zip',
 '/Users/sunqingyao/Envs/django_test/lib/python3.6',
 '/Users/sunqingyao/Envs/django_test/lib/python3.6/lib-dynload',
 '/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6',
 '/Users/sunqingyao/Envs/django_test/lib/python3.6/site-packages']
Server time:    Tue, 28 Mar 2017 13:01:58 +0800

当我改变时

search_fields = ['__str__']

search_fields = ['identity']

我得到了一个 TypeError

TypeError at /admin/blog/blogger/
Related Field got invalid lookup: icontains
Request Method: GET
Request URL:    http://127.0.0.1:8000/admin/blog/blogger/?q=user
Django Version: 1.10.6
Exception Type: TypeError
Exception Value:    
Related Field got invalid lookup: icontains
Exception Location: /Users/sunqingyao/Envs/django_test/lib/python3.6/site-packages/django/db/models/fields/related.py in get_lookup, line 694
Python Executable:  /Users/sunqingyao/Envs/django_test/bin/python
Python Version: 3.6.0
Python Path:    
['/Users/sunqingyao/PycharmProjects/diyblog',
 '/Users/sunqingyao/PycharmProjects/diyblog',
 '/Users/sunqingyao/Envs/django_test/lib/python36.zip',
 '/Users/sunqingyao/Envs/django_test/lib/python3.6',
 '/Users/sunqingyao/Envs/django_test/lib/python3.6/lib-dynload',
 '/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6',
 '/Users/sunqingyao/Envs/django_test/lib/python3.6/site-packages']
Server time:    Tue, 28 Mar 2017 13:12:09 +0800

我应该将search_fields 设置为什么值?

【问题讨论】:

    标签: python sql django django-models django-admin


    【解决方案1】:

    检查search_fields 文档,如那里所述

    这些字段应该是某种文本字段,例如 CharField 或 文本域。您还可以对 ForeignKey 或 带有查找 API “follow” 表示法的 ManyToManyField:

    search_fields = ['foreign_key__related_fieldname']
    

    所以你的情况

    search_fields = ['identity__username']
    

    另请注意,它并没有说您可以像最初尝试的那样使用计算属性

    【讨论】:

      【解决方案2】:

      这样写你的管理类

           #Register your models here.
           class BloggerAdmin(admin.ModelAdmin):
               list_display = ('__str__', 'identity')
               search_fields = ['identity__fieldname', ]
      
           admin.site.register(Blogger, BloggerAdmin)
      

      搜索字段必须是这样identity__fieldname

      【讨论】:

        猜你喜欢
        • 2013-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多