首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Django | Admin将外键显示为字段而不是对象

在Django的Admin界面中,默认情况下,外键(ForeignKey)字段会显示为关联对象的字符串表示。如果你希望将外键显示为字段而不是对象,可以通过自定义Admin类来实现。

基础概念

  • 外键(ForeignKey):在数据库中,外键是一个字段或一组字段,其值必须是另一个表的主键的值。它用于建立两个表之间的关联。
  • Django Admin:Django的Admin界面是一个自动生成的管理界面,用于管理模型数据。

相关优势

  • 易用性:将外键显示为字段可以提高用户体验,使管理员更容易理解和操作数据。
  • 灵活性:自定义Admin界面可以满足特定的业务需求,提供更灵活的数据展示方式。

类型与应用场景

  • 直接显示字段:适用于需要快速查看或编辑外键字段值的场景。
  • 自定义显示:适用于需要根据具体需求定制显示内容的复杂场景。

示例代码

假设我们有两个模型AuthorBook,其中Book模型有一个外键指向Author模型:

代码语言:txt
复制
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

默认情况下,在Django Admin中,Book模型的author字段会显示为关联的Author对象的字符串表示(通常是Author对象的__str__方法的返回值)。

我们可以通过自定义Admin类来将外键显示为字段:

代码语言:txt
复制
from django.contrib import admin
from .models import Book, Author

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author_name')

    def author_name(self, obj):
        return obj.author.name
    author_name.short_description = 'Author Name'

admin.site.register(Book, BookAdmin)
admin.site.register(Author)

在这个示例中,我们定义了一个BookAdmin类,并在其中添加了一个author_name方法,该方法返回Book对象的author字段的name属性。通过将author_name添加到list_display中,我们可以在Admin界面的列表视图中直接显示作者的名字。

解决问题的原因

  • 默认行为:Django Admin默认将外键显示为关联对象的字符串表示。
  • 自定义需求:有时我们需要根据具体需求定制显示内容,以提高用户体验和操作效率。

解决方法

通过自定义Admin类中的方法,并将其添加到list_display中,可以实现将外键显示为字段的功能。

应用场景

  • 图书管理系统:在图书管理系统中,管理员可能需要快速查看书籍的作者名字,而不是点击链接查看详细信息。
  • 订单管理系统:在订单管理系统中,管理员可能需要快速查看订单的客户信息,而不是点击链接查看详细信息。

通过这种方式,你可以灵活地定制Django Admin界面的显示内容,以满足不同的业务需求。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Django 1.10中文文档-第一个应用Part7-自定义管理站点

并且在字段数据很多时,还可以将表单分割成多个字段的集合: # polls/admin.py from django.contrib import admin from .models import Question...添加关联对象 现在Question的管理页面有了,但是一个Question应该有多个Choices。而此时管理页面并没有显示。现在有两个方法可以解决这个问题。...在这个表单中,Question字段是一个select选择框,包含了当前数据库中所有的Question实例。Django在admin站点中,自动地将所有的外键关系展示为一个select框。...在我们的例子中,目前只有一个question对象存在。 请注意图中的绿色加号,它连接到Question模型。每一个包含外键关系的对象都会有这个绿色加号。...填入相关信息点击保存后,Django自动将该Question保存在数据库,并作为当前Choice的关联外键对象。通俗讲就是,新建一个Question并作为当前Choice的外键。

3.6K60
  • Django模型

    表示小数位数 FloatField 浮点数 DateField 日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False...外键 外键这个东西,通常都是在业务逻辑层面来实现的,而不是在数据库中实现。但是通常大家学习的数据库课程中,都会有数据库设计范式,其中有个第三范式就是专指的外键约束。在这里只是简单的介绍一下。...二元组的第一个值会储存在数据库中,而第二个值将只会用于在表单中显示。对于一个模型实例,要获取该字段二元组中相对应的第二个值,使用 get_FOO_display() 方法。...它的常用值可以如下: CASCADE级联,删除主表数据时连通一起删除外键表中数据 PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据 SET_NULL设置为NULL...,此选项会抛出IntegrityError异常 注意:我们在数据库中,设置外键的时候需要制定另一张表中关联的字段,但是在Django里并没有指定。

    1.9K20

    Django 3.1 官网学习路线

    我们将很快看到,它不仅用于数据库架构,而且用于验证。 字段还可以有各种可选参数;在本例中,我们将投票的默认值设置为 0。 最后,请注意使用外键定义了关系。...按照惯例,Django 会将"_id"附加到外键字段名。(是的,你也可以重写这个。) 外键关系是通过外键约束来显式的。...“添加选择”表单如下所示: 在该表单中,“Question”字段是一个选择框,包含数据库中的每个问题。Django 知道一个外键应该在管理中表示为一个框。在我们的例子中,目前只存在一个问题。...默认情况下,为 3 个选项提供足够的字段。” 加载“添加问题”页面,看看是什么样子: 不过有一个小问题。它需要大量的屏幕空间来显示用于输入相关选择对象的所有字段。...使用表格内联(而不是 StackedInline),相关对象将以更紧凑的、基于表格的格式显示: 自定义管理员更改列表 现在问题管理页面看起来不错了,让我们对“更改列表”页面做一些调整——这个页面显示系统中的所有问题

    8.2K10

    35.Django2.0文档

    相对列表来说,有些时候我们更需要获取单个的对象, `` get()`` 方法就是在此时使用的: ? 这样,就返回了单个对象,而不是列表(更准确的说,QuerySet)。...请注意,date_hierarchy接受的是* 字符串* ,而不是元组。因为只能对一个日期型字段进行层次划分。  ...filter_horizontal和filter_vertical选项只能用在多对多字段上, 而不能用于ForeignKey字段。 默认地,管理工具使用`` 下拉框`` 来展现`` 外键`` 字段。...它是一个包含外键字段名称的元组,它包含的字段将被展现成`` 文本框`` ,而不再是`` 下拉框`` 。...例如,你可以给一个用户添加和修改publishers的权限,而不给他删除的权限。 请注意,这些权限是定义在模块级别上,而不是对象级别上的。

    11.3K100

    Django 1.10中文文档-第一个应用Part2-模型和管理站点

    (你也可以重写这个行为); 按照惯例,Django会在外键的字段名后面添加 "_id"。(你依然可以重写这个行为); 外键关系由FOREIGN KEY约束显式声明。...不用在意DEFERRABLE部分;它只是告诉PostgreSQL直到事务的最后再执行外键关联; 这些SQL语句是针对你所使用的数据库定制的,所以会为你自动处理某些数据库所特有的字段例如auto_increment...让我们来修复这个问题,让Django在打印对象时显示一些我们指定的信息。...它就是我们先前创建的一个question,并且通过str方法的帮助,显示了较为直观的信息,而不是一个冷冰冰的对象类型名称。 ? 点击What’s up?进入编辑界面: ?...你将看到一个页面,列出了通过Django管理界面对此对象所做的全部更改的清单,包含有时间戳和修改人的姓名等信息: ? 到此,你对模型API和admin站点有了一定的熟悉,可以进入下一阶段的教程了。

    2.3K60

    关于“Python”的核心知识点整理大全59

    下面来修改模型Topic,在其中添加一个关联到用户的外键。这样做后,我们必须对数据库 进行迁移。最后,我们必须对有些视图进行修改,使其只显示与当前登录的用户相关联的数据。 1....中的模型User,然后在Topic中添加了字段owner,它建 立到模型User的外键关系。...在2处的输出中,Django指出我们试图给既有 模型Topic添加一个必不可少(不可为空)的字段,而该字段没有默认值。...为将所有既有主题都关联到管理用户ll_admin,我输入了用户ID值1(见6)。并非必须使用 超级用户,而可使用已创建的任何用户的ID。...正如你看到的,现在每个主题都属于用户ll_admin。 注意 你可以重置数据库而不是迁移它,但如果这样做,既有的数据都将丢失。一种不错的做 法是,学习如何在迁移数据库的同时确保用户数据的完整性。

    14410

    Django3.2边学边记—Adimn站点管理

    (Test)class TestAdmin(admin.ModelAdmin):    pass 页大小 每页中显示多少条数据,默认为每页显示100条数据,设置为20 12 class TestAdmin...控制显示的列,Django 会尝试按照这个顺序解释 list_display 的每个元素: 一个模型的字段。 一个可调用对象。 一个代表 ModelAdmin 属性的字符串。...None,一个空字符串,或者一个没有元素的可迭代字段,Django 将显示 - (破折号)。   ...过滤器 用 list_filter 来激活管理更改列表页面右侧侧栏的过滤器,如下截图所示: list_filter 应是一个列表或元组,参数字段可以是模型字段,包括外键字段(注意list_display...是不能直接接收外键字段的),会将对应字段的值列出来,一般用于快速过滤有重复值的字段。

    1.3K30

    37.Django1.11.6文档

    我们建议您将此标志设置为False而不是删除帐户;这样,如果您的应用程序对用户有任何外键,则外键不会中断。 它不是用来控制用户是否能够登录。 ...如果该字段为True 或NullBooleanField,Django 会显示漂亮的"on"或"off"图标而不是BooleanField 或False。...例如,如果所有者可以拥有多个汽车,并且汽车可以属于多个所有者 - 多对多关系,则您可以过滤Car外键字段,仅显示由User: class MyModelAdmin(admin.ModelAdmin):...这是因为,就管理而言,through只是一个具有两个外键字段而不是多对多关系的模型。 在所有其他方面,InlineModelAdmin与任何其他方面完全相同。 ...会话对象指南 在request.session 上使用普通的Python 字符串作为字典的键。 这主要是为了方便而不是一条必须遵守的规则。

    24.4K80

    Django项目知识点(三)

    Django自动为每个设置了admin的对象创建添加,删除和修改的权限。...DateTimeField.auto_now_add 这个参数的默认值也为False,设置为True时,会在model对象第一次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新...null 如果是True,Django会在数据库中将此字段的值置为NULL,默认值是False blank 如果为True时django的 Admin 中添加数据时可允许空值,可以不填。...default 默认值 verbose_name   Admin中字段的显示名称,如果不设置该参数时,则与属性名。...SET_NULL:此值设置,会把外键设置为null,前提是允许为null。 SET_DEFAULT:此值设置,会把设置为外键的默认值。 SET():此值设置,会调用外面的值,可以是一个函数。

    1.9K30

    Django中ORM操作

    1、无需连表查询性能低,省硬盘空间(选项不固定时用外键) 2、在modle文件里不能动态增加(选项一成不变用Django的choice) 其他字段 db_index = True 表示设置索引 unique...") 注意对象集合调用values(),正向查询是外键字段__XX,而反向是小写表名__YY看起来比较容易混淆; books=models.Publish.objects.filter(name..., Foreign_Key字段在哪张表就可以哪张表使用Foreign_Key字段连表,反之没有Foreign_Key字段就使用与其关联的 小写表名; 1对多:对象.外键.关联表字段,values(外键字段...__关联表字段) 多对多:外键字段.all() 反向连表操作总结: 通过value、value_list、fifter 方式反向跨表:小写表名__关联表字段 通过对象的形式反向跨表:小写表名...().first() result = obj.userinfo_set.all() [userinfo对象,userinfo对象,] 小写的表名 得到有外键关系的列 #因为使用values取值取得是字典的不是对象

    4.8K10

    【云+社区年度正文】Django从入门到精通No.2----模型

    1.多对一 因为是关联关系,所以我们必须指定两个类来进行相互操作,这里涉及到一个外键的操作,即ForeignKey字段,而且外键要定义在多的一方。...与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象) related_name=None # 反向操作时,使用的字段名,用于代替表名_set related_query_name...db_constraint=True # 是否在数据库中创建外键约束 parent_link=False # 在Admin中是否显示关联数据 2.多对多 多对多的表...,必须设中间关联表,关联表设独立主键,并引入两个“多”头的表的主键作为关联表的外键。...六、总结 以上就是django所有的关于模型的概念了,接下来小编将通过与数据库交互来带着大家一起操作表。

    2.1K00

    Django 学习笔记之模型高级用法(上)

    2.1 ForeignKey 1) on_delete 在 Django 2.0 中,设置外键时需要添加一个 on_delete选项。外键本身涉及到两个表的数据,况且外键在数据库中是有约束行为。...SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是`blank=True, null=True`,定义该字段的时候,允许为空。...SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。 SET(): 自定义对应的实体的值。...2)limit_choices_to 该参数用于限制外键所能关联的对象,只能用于 Django 的 ModelForm(Django的表单模块)和 admin 后台,对其它场合无限制功能。...如果设为 False,那么将无法保证数据的完整性和合法性。 4) related_name 用于关联对象反向引用模型的名称。主要用于反向查询,即外键源模型实例通过管理器返回第一个模型的所有实例。

    2K30

    Django model 层之Models与Mysql数据库小结

    第一次创建对象时,自动设置field值为当前日期,所以,即便显示为该字段提供了值,也会自动忽视显示设定的值。...DateField.auto_now_add 第一次创建对象时,自动设置field值为当前日期,所以,即便显示为该字段提供了值,也会自动忽视显示设定的值。...如果设置了该选项值,那么默认的表单组件将变为一个select box,而不是标准是text field,且将被限制从给定choice中选择choice。...SET_DEFAULT 删除被参照表的某条表记录,设置参照表中,同待删除记录存在外键关联的记录的外键列值为默认值。必须为外键列设置默认值。...SET() 删除被参照表的某条表记录,设置参照表中,同待删除记录存在外键关联关系的记录的外键列值为传递给SET()的参数值,如果传递给SET()的参数值是可调用对象,则设置为调用可调用对象获取的结果。

    2.2K20
    领券