一  使用环境

  开发系统: windows

  IDE: pycharm  

  数据库: msyql,navicat

  编程语言: python3.7  (Windows x86-64 executable installer)

  虚拟环境: virtualenvwrapper

  开发框架: Django 2.2

二 Django Admin 在内联中覆盖保存方法(admin.TabularInline)

1.在你的app下新建一个py文件: inlineforms.py

from django.forms.models import BaseInlineFormSet
from A001jcxx.models import CompanyEmail


# django admin在内联中覆盖保存方法
# 级联企业邮箱自动增加编号
class CompanyEmailFormset(BaseInlineFormSet):
    def save_new(self, form, commit=True):
        obj = super(CompanyEmailFormset, self).save_new(form, commit=False)
        # 在这里你可以从请求中添加任何你需要的东西
        ret = CompanyEmail.objects.exists()  # 判段表中有值没有
        if not ret:
            number = 'EM0001'
        else:
            邮箱编号 = CompanyEmail.objects.last().邮箱编号  # 取最后一条人员编号
            number = 'EM' + str(int(邮箱编号[2:]) + 1).zfill(4)
        obj.邮箱编号 = number
        commit = True
        if commit:
            obj.save()
        return obj

2.在admin.py你的内联类中,也可以继也没有(admin.StackedInline),这样内联表的显示方式就不样,一个字段横着排列,一个是竖着提列.

# 03-01级联企业邮箱(单独创建class,继承TabularInline)
class EmailInline(admin.TabularInline):
    model = CompanyEmail  # 关联的表
    extra = 1  # 增加时默认增加几个邮箱  
    exclude = ('删除标记', '邮箱编号')  # 不显示字段
    formset = CompanyEmailFormset  # 增加编号设置
    
    # 增加编号方法   
    def get_formset(self, request, obj=None, **kwargs):
        formset = super(EmailInline, self).get_formset(request, obj, **kwargs)
        formset.request = request
        return formset

 

 说明:

我要在企业表中内联编辑对应的一对多邮箱表,邮箱表中的邮箱编号是自动生成的,这个方法就是在内联表中执行自动生成并保存到数据库的方法.

1.增加时,隐藏了'邮箱编号',如果不用方法,手动写就可以在邮箱表中保存.

Django Admin 在内联中覆盖保存方法(admin.TabularInline)

 

2.增加后到邮箱表中查看,"邮箱编号"就会自动生成EM0001,如果不用内联覆盖保存方法,此时"邮箱编号"就会是空.

 Django Admin 在内联中覆盖保存方法(admin.TabularInline)

 

 

 

 

 

  开发系统: windows

  IDE: pycharm  

  数据库: msyql,navicat

  编程语言: python3.7  (Windows x86-64 executable installer)

  虚拟环境: virtualenvwrapper

  开发框架: Django 2.2

二 Django Admin 在内联中覆盖保存方法(admin.TabularInline)

1.在你的app下新建一个py文件: inlineforms.py

from django.forms.models import BaseInlineFormSet
from A001jcxx.models import CompanyEmail


# django admin在内联中覆盖保存方法
# 级联企业邮箱自动增加编号
class CompanyEmailFormset(BaseInlineFormSet):
    def save_new(self, form, commit=True):
        obj = super(CompanyEmailFormset, self).save_new(form, commit=False)
        # 在这里你可以从请求中添加任何你需要的东西
        ret = CompanyEmail.objects.exists()  # 判段表中有值没有
        if not ret:
            number = 'EM0001'
        else:
            邮箱编号 = CompanyEmail.objects.last().邮箱编号  # 取最后一条人员编号
            number = 'EM' + str(int(邮箱编号[2:]) + 1).zfill(4)
        obj.邮箱编号 = number
        commit = True
        if commit:
            obj.save()
        return obj

2.在admin.py你的内联类中,也可以继也没有(admin.StackedInline),这样内联表的显示方式就不样,一个字段横着排列,一个是竖着提列.

# 03-01级联企业邮箱(单独创建class,继承TabularInline)
class EmailInline(admin.TabularInline):
    model = CompanyEmail  # 关联的表
    extra = 1  # 增加时默认增加几个邮箱  
    exclude = ('删除标记', '邮箱编号')  # 不显示字段
    formset = CompanyEmailFormset  # 增加编号设置
    
    # 增加编号方法   
    def get_formset(self, request, obj=None, **kwargs):
        formset = super(EmailInline, self).get_formset(request, obj, **kwargs)
        formset.request = request
        return formset

 

 说明:

我要在企业表中内联编辑对应的一对多邮箱表,邮箱表中的邮箱编号是自动生成的,这个方法就是在内联表中执行自动生成并保存到数据库的方法.

1.增加时,隐藏了'邮箱编号',如果不用方法,手动写就可以在邮箱表中保存.

Django Admin 在内联中覆盖保存方法(admin.TabularInline)

 

2.增加后到邮箱表中查看,"邮箱编号"就会自动生成EM0001,如果不用内联覆盖保存方法,此时"邮箱编号"就会是空.

 Django Admin 在内联中覆盖保存方法(admin.TabularInline)