zoukankan      html  css  js  c++  java
  • 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是让关联的字段纵向显示,多说无益,直接看效果。

    列表页面

    编辑页面

    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]
    
    

  • 相关阅读:
    How to create jar for Android Library Project
    Very large tabs in eclipse panes on Ubuntu
    64bit Ubuntu, Android AAPT, R.java
    Linux(Ubuntu)下如何安装JDK
    Configure xterm Fonts and Colors for Your Eyeball
    建立、配置和使用Activity——启动其他Activity并返回结果
    建立、配置和使用Activity——使用Bundle在Activity之间交换数据
    建立、配置和使用Activity——启动、关闭Activity
    建立、配置和使用Activity——Activity
    异步任务(AsyncTask)
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/10511220.html
Copyright © 2011-2022 走看看