上海python一对一培训_python测试开发django-33.admin后台一对一关系OneToOneField

前言

假如有一张表(Card)记录用户的卡号信息和用户名,现在需要新增一个小功能,记录用户的手机号,邮箱和住址等更多信息。

为了不影响原来的表设计,可以新增一张表(CardDetail),专门记录用户的其它更多信息。

银行账户(Card)和联系方式(CardDetail),一个银行账户对应一个联系人,而一个联系人也只对应一个账户,这就是一对一关系。

一对一表设计

在models.py创建数据模型, Card表记录卡号、姓名、添加时间基本的信息,CardDetail使用OneToOneField关联Card表,记录电话、邮箱、城市、详细地址。

OneToOneField里面有两个参数必填,第一个参数传关联的表名称,第二个参数on_delete=models.CASCADE(对象删除后,包含OneToOneField的字段也会被删除)

# models.py

from django.db import models

# Create your models here.

class Card(models.Model):

'''银行卡 基本信息'''

card_id = models.CharField(max_length=30, verbose_name="卡号", default="")

card_user = models.CharField(max_length=10, verbose_name="姓名", default="")

add_time = models.DateField(auto_now=True, verbose_name="添加时间")

class Meta:

verbose_name_plural = '银行卡账户'

verbose_name = "银行卡账户_基本信息"

def __str__(self):

return self.card_id

class CardDetail(models.Model):

'''银行卡 详情信息'''

card = models.OneToOneField(Card,

on_delete=models.CASCADE,

verbose_name="卡号"

)

tel = models.CharField(max_length=30, verbose_name="电话", default="")

mail = models.CharField(max_length=30, verbose_name="邮箱", default="")

city = models.CharField(max_length=10, verbose_name="城市", default="")

address = models.CharField(max_length=30, verbose_name="详细地址", default="")

class Meta:

verbose_name_plural = '个人资料'

verbose_name = "账户_个人资料"

def __str__(self):

return self.card.card_user

admin.py设置后台页面显示详情

# admin.py

from django.contrib import admin

from hello import models

# Register your models here.

class MoreInfo(admin.StackedInline):

model = models.CardDetail

@admin.register(models.Card)

class ControlCard(admin.ModelAdmin):

list_display = ["card_id", "card_user", "add_time"]

# 在Card页面显示更多信息CardDetail

inlines = [MoreInfo]

表设计好之后执行下面两句

makemigrations会在当前目录下生成一个migrations文件夹,该文件夹的内容就是数据库要执行的内容

python manage.py makemigrations

migrate就是执行之前生成的migrations文件,这一步才是操作数据库的一步

python manage.py migrate

inlines关联显示

为了让 CardDetail 里面信息和Card的信息在一个页面上展示,这里需用到 inlines 参数,关联过去。

先写一个MoreInfo类,继承了admin.StackedInline,StackedInline是让关联的字段纵向显示,多说无益,直接看效果。

列表页面

1070438-20190311160009559-1482171632.png

编辑页面

1070438-20190311160033946-1449534504.png

StackedInline和TabularInline

StackedInline是纵向显示,显示效果如上面图,TabularInline是横线显示,显示效果如下图

# amdin.py

# StackedInline改成StackedInline

class MoreInfo(admin.StackedInline):

model = models.CardDetail

@admin.register(models.Card)

class ControlCard(admin.ModelAdmin):

list_display = ["card_id", "card_user", "add_time"]

# 在Card页面显示更多信息CardDetail

inlines = [MoreInfo]

1070438-20190311160511407-269429350.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值