网络编程
位置:首页>> 网络编程>> Python编程>> 在django admin中配置搜索域是一个外键时的处理方法

在django admin中配置搜索域是一个外键时的处理方法

作者:davidsu33  发布时间:2021-02-20 18:48:26 

标签:django,admin,搜索域,外键

python 2.7.11

django 1.8.4

错误内容:related Field has invalid lookup: icontains

我原来默认认为在处理外键搜索的时候,django会自动将该外键的行数据以str()化之后进行搜索,但其实并不是这样的,如果将外键加入到搜索域中,需要明确写出来。

这个是我从网上查到的解决方案,测试可用,如下:

models.py 文件


# coding:utf8
from django.db import models

class Book(models.Model):

name = models.CharField(max_length=255)
 title = models.CharField(max_length=255)
 price = models.IntegerField()
 ...

class Category(models.Model):

CATEGORY_CHOICES = (
   ('00', 'English'),
   ('01', 'Computer'),
 )

book = models.ForeignKey(Book)
 category = models.CharField(max_length=255, choices=CATEGORY_CHOICES)
 remark = models.CharField(max_length=255)
 ...

admin.py 文件(以 category 为例)


# coding: utf8
from django.contrib import admin
from django import forms

from .models import Category

class CategoryAdmin(admin.ModelAdmin):

search_fileds = ('book__name', 'book__title', 'book__price', 'category') # 设置搜索栏范围,如果有外键,要注明外键的哪个字段,双下划线
 list_display = ('book', 'category') # 在页面上显示的字段,若不设置则显示 models.py 中 __unicode__(self) 中所返回的值
 list_display_links = ('category') # 设置页面上哪个字段可单击进入详细页面
 fields = ('category', 'book') # 设置添加/修改详细信息时,哪些字段显示,在这里 remark 字段将不显示

admin.site.register(Category, CategoryAdmin)

[ 说明 ]

在使用 Django admin 系统中的搜索时可能会出现“related Field has invalid lookup: icontains”错误,主要原因是外键查询是需要指定相应的字段的。

外键不应该只是一个model,而该是另一个表的明确的一个字段。

所以我们需要指定特定的字段 "本表外键字段__外键所在表需查询字段"。

补充知识:Django的model中使用外键,但在页面上显示的是xxx_object?

在Django中定义了如下A,B两个模型:


class A:
  name=models.CharField(max_length=15)
  def __unicode__(self):
      return self.name

class B:
  name=models.CharField(max_length=15)
  f=models.ForeignKey(A,on_delete=models.DO_NOTHING)

def __unicode__(self):
     return self.name

注:我在测试环境中使用的是python2.7,一切操作做完之后,部署到云服务器上后,就在后台管理系统中看到B的属性一栏中f显示为A_Object,并没有显示A的属性——name的值。

究其缘由,发现我的云服务器上用的是python3.6,在这里要将__unicode__()方法替换成__str__()方法才行.


class A:
  name=models.CharField(max_length=15)
  def __str__(self):
      return self.name

class B:
  name=models.CharField(max_length=15)
  f=models.ForeignKey(A,on_delete=models.DO_NOTHING)

def __str__(self):
     return self.name

当然,如果使用的版本是python3.x,为了更好地兼容python2.x,可以使用@python_2_unicode_compatible装饰器来使python2.x想python3.x一样处理Unicode字符。


from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible
class A:
  name=models.CharField(max_length=15)
  def __str__(self):
      return self.name

@python_2_unicode_compatible
class B:
  name=models.CharField(max_length=15)
  f=models.ForeignKey(A,on_delete=models.DO_NOTHING)

def __str__(self):
     return self.name

来源:https://blog.csdn.net/davidsu33/article/details/51672163

0
投稿

猜你喜欢

  • 随着CSS 框架的流行升温不断,前端er们也越来越关注CSS框架的使用,国内也有很多关于各种CSS框架的使用技巧和教程,彬Go一直关注着各种
  • Python可以使用 xml.etree.ElementTree 模块从简单的XML文档中提取数据。 为了演示,假设你想解析Planet P
  • Pillow图像降噪处理由于成像设备、传输媒介等因素的影响,图像总会或多或少的存在一些不必要的干扰信息,我们将这些干扰信息统称为&l
  • 先说下自己的环境,redis是部署在centos上的,爬虫运行在windows上,1. 安装redisyum install -y redi
  • 占位符,顾名思义就是插在输出里站位的符号。占位符是绝大部分编程语言都存在的语法, 而且大部分都是相通的, 它是一种非常常用的字符串格式化的方
  • asp之家注:为什么要防止访客频繁刷新页面呢?也许你会说他想刷新就让他刷新吧,没什么关系,而且还增加了网页的PV,呵呵。但是有的页面我们可能
  • Demo里的三种方法:方法1是两层div,兼容FF3.1a+, Safari 3+, Chrome, IE6/7方法2是两层div,除了IE
  • 一、手指触屏,利用touchstart和touchend计算前后滑动距离,判断是上拉还是下滑。二、js中距离:pageY、clientY、o
  • 思考:当我们输入这个语句的时候,Python内部是如何去创建这个对象的?a = 1.0对象使用完毕,销毁的时机又是怎么确定的呢?下面,我们以
  • 一、分析链接上一篇文章指路一般来说,我们参加某个网站的盖楼抽奖活动,并不是仅仅只参加一个,而是多个盖楼活动一起参加。这个时候,我们就需要分析
  • 假设现有需求如下:需要一个页面分页展示信息,在该页面添加搜索框以提供检索功能。那么,我们知道,展示信息和检索功能是在同一个页面,也就是共用一
  • 数据库系统的安全性包括很多方面。由于很多情况下,数据库服务器容许客户机从网络上连接,因此客户机连接的安全对MySQL数据库安全有很重要的影响
  • 数据库是数据的集合,与数学的集合论有密不可分的关系。为提高查询速度,我们可以:对数据表添加索引,以加快搜索速度;通过编程技巧最大限度地利用索
  • 由于在Python2 中的默认编码为ASCII,但是在Python3中的默认编码为UTF-8。问题:所以在使用np.load(det.npy
  • 1、获取文件的创建、修改、访问时间# -*- encoding=utf-8 -*-import osimport timedef get_f
  • 用python加“验证码”为关键词在baidu里搜一下,可以找到很多关于验证码识别的文章。我大体看了一下,主要方法有几类:一类是通过对图片进
  • 简介本文主要介绍python数组循环语法。主要方式有元素遍历,索引遍历,enumerate, zip, list内部等。普通循环list1
  • 将视图与缓存系统进行了耦合,从几个方面来说并不理想。 例如,你可能想在某个无缓存的站点中重用该视图函数,或者你可能想将该视图发布给那些不想通
  • 双向链表的基本操作的实现,供大家参考,具体内容如下在之前的博客中介绍了三种链表,分别是单链表、单向循环链表以及双向链表。本篇博客将用Pyth
  • Python中有两种循环,分别为:for循环和while循环。1. for循环for循环可以用来遍历某一对象(遍历:通俗点说,就是把这个循环
手机版 网络编程 asp之家 www.aspxhome.com