项目开发时遇到的一个需求,有一个SysUser表和一个Company表,字段如下所示,我们需要在django admin中在SysUser基本信息的时候一起渲染出Company_name而不是Company_id。
class Company(models.Model):
class Meta:
verbose_name = "公司管理"
verbose_name_plural = verbose_name
company_id = models.AutoField(primary_key=True, verbose_name='公司ID')
company_name = models.CharField(max_length=255, verbose_name='公司名称', unique=True)
company_descrption = models.CharField("公司描述", null=True, max_length=255)
creator_id = models.IntegerField(null=True, blank=True, verbose_name='创建者ID')
create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
update_id = models.IntegerField(null=True, blank=True, verbose_name='更新者ID')
update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
deleted_choice = (
(True, "是"),
(False, "否")
is_deleted = models.BooleanField("逻辑删除", default=False, choices=deleted_choice)
def __str__(self):
return self.company_name
class SysUser(models.Model):
class Meta:
verbose_name = '用户管理'
verbose_name_plural = verbose_name
user_id = models.AutoField(primary_key=True, verbose_name='用户ID')
company_id = models.ForeignKey(Company, on_delete=models.DO_NOTHING, null=True, blank=True,
verbose_name='公司ID')
user_account = models.CharField(max_length=50, unique=True, verbose_name='用户账号')
user_password = models.CharField(max_length=128, verbose_name='用户密码')
user_name = models.CharField(max_length=50, verbose_name='用户名')
user_avatar = models.CharField(max_length=255, null=True, blank=True, verbose_name='用户头像地址')
user_email = models.EmailField(max_length=254, null=True, blank=True, verbose_name='用户邮箱')
user_phone = models.CharField(max_length=20, null=True, blank=True, verbose_name='用户电话')
user_create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
models.DateTimeField()
user_update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
status_choices = (
(1, "正常"),
(0, "停用")
user_status = models.SmallIntegerField(default=1, null=True, blank=True, choices=status_choices,
verbose_name='用户状态', help_text="默认1为正常,0表示停用")
- 在django 3.2之后,支持使用
@admin.display()
装饰器来定制化一些需要显示字段。在本示例中,我需要查询company_id对应的company_name再显示出来,因此对应代码解决方案如下所示:
@admin.register(models.SysUser)
class SysUserAdmin(admin.ModelAdmin):
list_display = (
"user_id", "user_account", "user_name", "company_name", "user_phone", "user_email", "user_create_time",
'user_status')
@admin.display(description="公司名称")
def company_name(self, obj):
return obj.company_id.company_name if obj.company_id else ''
![在这里插入图片描述](https://img-blog.csdnimg.cn/26be8d3abeb44978baa08657add43921.png)
- 如果不用装饰器的话,代码如下所示:(还是觉得用装饰器会方便一些)
from django.contrib import admin
from .models import SysUser
@admin.register(SysUser)
class SysUserAdmin(admin.ModelAdmin):
list_display = ('user_id', 'company', 'user_account', 'user_name', 'user_email', 'user_phone', 'user_status')
def company(self, obj):
return obj.company_id.company_name
company.short_description = '公司名称'
django 1.8.4
错误内容:related Field has invalid lookup: icontains
我原来默认认为在处理外键搜索的时候,django会自动将该外键的行数据以str()化之后进行搜索,但其实并不是这样的,如果将外键加入到搜索域中,需要明确写出来。
这个是我从网上查到的解决方案,测试可用,如下:
models.py
目录一、如何构建模型外键1. app内的外键构建2. 跨app的外键构建二、外键约束 - 删除操作的参数配置三、多表外键绑定,起别名 - related_name1. 别名的实际应用 - 外键值查询 - 反向过滤器的搜索
一、如何构建模型外键
1. app内的外键构建
# app/models.py
class App1(models.Model):
class App2(models.Model):
app2 = models.ForeignKey("App1", on_delet
class CategoryAdmin(admin.ModelAdmin):
list_display = ('name','admins') #admin是外键
def admins(self,obj):
return obj.admins.username
在使用Django的xadmin框架进行web开发时,有时需要在后台的列表中显示某字段统计外键关联的其他列表的数据内容,并进行数据的统计结果可视化。通过以上步骤成功地使用Django的xadmin框架实现了在后台的列表中统计外键关联数据的功能。属性来指定在列表中显示的字段。通过以上配置,已经实现了在后台的文章大类列表中显示每个大类下有多少个子栏目的功能。通过以上配置,已经实现了在后台的文章栏目列表中显示每个栏目下包含多少篇文章的功能。同样的方式,可以在文章栏目列表中显示每个栏目下包含多少篇文章的统计结果。
首先,我这个想增加这个模型数据时有一个下拉选项是Customer表中的字段,然后想通过选择该选项保存后,把这个选项的值添加到本表中的customer_name字段。
第一个红框处是外键关联表名,第二个红框处是关联字段名,第三个是级联删除动作,必须要有,不然报错。
2.因为要做外键关联,所以models中,Customer这张表就必须要加unique=True唯一参数,不然一样会报错。还有就是因为要返回是个字段的值,而不是一个数据集,所以在python3中我们要添加一个
这样才能使下拉选项是字段的值,
django中admin设置-让你的admin后台更加漂亮实用
from django.contrib import admin
from Interface_App.models import Sql_Interface
# 登录时显示的名称
admin.site.site_header = '平台管理后台1111'
![登录时显示的名称](https://img-blog.csdnimg.cn/20201230105941608.png?x-oss-process=image/watermark,ty
默认情况下,admin仅显示一个字段。我们可以配置admin,让其显示多个字段:
class departAdmin(admin.ModelAdmin):
list_display = ('name','longName','father')
class managerAdmin(admin.ModelAdmin):
list_display = ('name'...