自定义 Django Admin:在父 Add_View 上添加多个默认内联

2023-12-10

我有一个管理模型,其中包含一些内联模型(请参阅资源用户管理全班型号如下):

    inlines = [ 
            ResourceLocationInlineAdmin ,
            ResourceCategoryInlineAdmin , 
            ResourceStageInlineAdmin ,
          ]

当用户点击创建新的资源用户管理我想要班级的内联资源类别内联管理获取初始值——请注意,这些关系不会保存到数据库中。我试图覆盖部分add_view函数来获得我想要的东西,但我不知道如何将多个内联表单传递回父级。

关于如何实现这一目标有什么想法吗?

Models

class ResourceUserAdmin( admin.ModelAdmin ):
    inlines = [ 
            ResourceLocationInlineAdmin ,
            ResourceCategoryInlineAdmin , 
            ResourceStageInlineAdmin ,
          ]

    list_display = ( 
                 'user' , 
                 'name' ,
                 'state' ,
                 'email' ,
                 'website' ,
                 'phone' ,
                 'logo_url_link',
    )

    search_fields = ( 'name' , 'email' , 'website'  )

    list_filter = ( 'name' , 'state' , 'email' , 'website' )

    ordering = ( 'name', )

     fields = ( 
             'user' , 
             'name' ,
             'state' ,
             'email' ,
             'website' ,
             'phone' ,
             'logo' ,
             'ideal_candidate',
    )
admin.site.register( ResourceUser, ResourceUserAdmin )

这是我想默认创建的内联模型:

class ResourceCategoryInlineAdmin( admin.StackedInline ):
    model = ResourceCategory
    extra = 0

class ResourceCategoryAdmin( admin.ModelAdmin ):
    list_display = ( 'user' ,
                     'category' , )

    ordering = ( 'user' , )
    fields = ( 'user' , 'category' )

    def formfield_for_foreignkey( self, db_field, *args, **kwargs ):
        if isinstance( db_field, models.ForeignKey ):
            if db_field.name == 'category':
                kwargs['widget'] = forms.RadioSelect()
        return super( ResourceCategoryAdmin, self).formfield_for_foreignkey( db_field, **kwargs )

admin.site.register( ResourceCategory, ResourceCategoryAdmin )

这是一种解决方案,尽管不是我真正想使用的选项。你可以通过覆盖整个来做到这一点add_view函数并为表单集中的每个表单设置初始属性(查找下面的覆盖注释)

def add_view(self, request, form_url='', extra_context=None):
    "The 'add' admin view for this model."
    model = self.model
    opts = model._meta

    if not self.has_add_permission(request):
        raise PermissionDenied

    ModelForm = self.get_form(request)
    formsets = []
    if request.method == 'POST':
        form = ModelForm(request.POST, request.FILES)
        if form.is_valid():
            new_object = self.save_form(request, form, change=False)
            form_validated = True
        else:
            form_validated = False
            new_object = self.model()
        prefixes = {}
        for FormSet, inline in zip(self.get_formsets(request), self.inline_instances):
            prefix = FormSet.get_default_prefix()
            prefixes[prefix] = prefixes.get(prefix, 0) + 1
            if prefixes[prefix] != 1:
                prefix = "%s-%s" % (prefix, prefixes[prefix])
            formset = FormSet(data=request.POST, files=request.FILES,
                              instance=new_object,
                              save_as_new="_saveasnew" in request.POST,
                              prefix=prefix, queryset=inline.queryset(request))
            formsets.append(formset)
        if all_valid(formsets) and form_validated:
            self.save_model(request, new_object, form, change=False)
            form.save_m2m()
            for formset in formsets:
                self.save_formset(request, form, formset, change=False)

            self.log_addition(request, new_object)
            return self.response_add(request, new_object)
    else:
        # Prepare the dict of initial data from the request.
        # We have to special-case M2Ms as a list of comma-separated PKs.
        initial = dict(request.GET.items())
        for k in initial:
            logger.info( "for k in initial, k = %s" % k )
            try:
                f = opts.get_field(k)
            except models.FieldDoesNotExist:
                continue
            if isinstance(f, models.ManyToManyField):
                initial[k] = initial[k].split(",")
        form = ModelForm(initial=initial)
        prefixes = {}
        for FormSet, inline in zip(self.get_formsets(request),
                                   self.inline_instances):
            prefix = FormSet.get_default_prefix()
            prefixes[prefix] = prefixes.get(prefix, 0) + 1
            if prefixes[prefix] != 1:
                prefix = "%s-%s" % (prefix, prefixes[prefix])

            formset = FormSet(instance=self.model(), prefix=prefix, queryset=inline.queryset(request))

            #
            #
            # override the inlines of my choice
            # to create initial values
            #
            #
            if inline.__class__.__name__ == 'ResourceCategoryInlineAdmin':
                for frm, category in zip( formset, Category.objects.all() ):
                   frm.fields['category'].initial = category

            formsets.append(formset)

    adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)),
        self.prepopulated_fields, self.get_readonly_fields(request),
        model_admin=self)
    media = self.media + adminForm.media

    inline_admin_formsets = []
    for inline, formset in zip(self.inline_instances, formsets):
        fieldsets = list(inline.get_fieldsets(request))
        readonly = list(inline.get_readonly_fields(request))
        inline_admin_formset = helpers.InlineAdminFormSet(inline, formset,
            fieldsets, readonly, model_admin=self)
        inline_admin_formsets.append(inline_admin_formset)
        media = media + inline_admin_formset.media

    context = {
        'title': _('Add %s') % force_unicode(opts.verbose_name),
        'adminform': adminForm,
        'is_popup': "_popup" in request.REQUEST,
        'show_delete': False,
        'media': mark_safe(media),
        'inline_admin_formsets': inline_admin_formsets,
        'errors': helpers.AdminErrorList(form, formsets),
        'root_path': self.admin_site.root_path,
        'app_label': opts.app_label,
    }
    context.update(extra_context or {})
    return self.render_change_form(request, context, form_url=form_url, add=True)
    #return super(ResourceUserAdmin, self).add_view(request, form_url=form_url, extra_context=extra_context)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义 Django Admin:在父 Add_View 上添加多个默认内联 的相关文章

随机推荐

  • 如果目录中的文件数量发生变化,则通知按钮

    我有一个按钮 只要目录中没有特定数量的文件 我就想禁用它 是否有某种侦听器在目录中创建或删除文件时通知我 Java 当前没有对文件系统事件和监视的本机支持 JNotify是一个有用的库来执行此操作 您应该将其设置为监视目录的修改 然后自行确
  • Go 不识别在“for”循环中使用变量

    我正在用 Go 进行开发 并且运行以下命令for loop Define Initial Value i 0 for Get random data based on iteration data i GiveRandomData i Sa
  • 如何在 iText 中的 FontFactory.register 中加载自定义字体

    我需要您的帮助来添加自定义字体 arial ttf 该字体存储在我的项目的资源文件夹下FontFactory registeriText 中的方法 Windows资源管理器项目中的字体路径如下 public html resources f
  • python 中的分段错误?

    我正在使用 gtk3 创建 GUI 为了使 GUI 和操作协同工作 我使用以下代码创建了一个线程 threading Thread target function start 如果没有线程 一切都可以正常工作 但 GUI 将被冻结 使用线程
  • void* 指针和指向某些结构(布局)的指针兼容吗?

    换句话说 我可以重新解释 而不是转换 void 指针作为指向某种结构类型的指针 假设void 指针确实保存了正确转换的有效结构地址 实际上我对以下场景很感兴趣 typedef struct void struct void struct t
  • ModuleNotFoundError:没有名为“脚本”的模块

    我尝试安装PYAHK via pip install pyahk也python setup py install pip version pip 9 0 1 from c python36 lib site packages python
  • 列出来自 Soundcloud 的曲目并在 Wordpress 博客上使用 Soundmanager 2 进行播放

    首先 这并不是对完美编码解决方案的呼声 但如果有人至少能给我一些关于如何解决这个问题的提示 那就太完美了 我有一个用于唱片公司的自定义 WordPress 网站 在这个网站上当然有一个部分显示他们每个艺术家的曲目的发行 客户需要将所有曲目上
  • 使用谷歌地图javascript旋转具有多个路径的svg标记

    当我使用下面的简单 SVG 时 它与旋转方法配合得很好 var car M17 402 0H5 643C2 526 0 0 3 467 0 6 584v34 804c0 3 116 2 526 5 644 5 643 5 644h11 75
  • mysql系统变量table_type不起作用

    我无法设置系统变量 table type 当我尝试这样做时 出现以下错误 mysql gt SET table type InnoDB ERROR 1193 HY000 Unknown system variable table type
  • 如何以tinkerpop/gremlin 格式而不是DSE 图形格式返回顶点?

    我试图返回一个刚刚用 Gremlin 创建的顶点 以tinkerpop 格式 DseCluster dseCluster DseCluster builder addContactPoint DbC dseHost build DseSes
  • Kotlin数组初始化抛出空指针异常

    我是 kotlin 的初学者 我正在尝试使用接受大小和函数的构造函数来初始化数组 这就是我所拥有的 fun main args Array
  • Excel 引用当前单元格

    如何获取当前单元格的引用 例如 如果我想显示 A 列的宽度 我可以使用以下命令 CELL width A2 但是 我希望公式是这样的 CELL width THIS CELL 晚了几年 为了完整起见 我想给出另一个答案 首先 转到Excel
  • 为什么上课没有顺序?

    html div class one two test div div class two one test div css one two color red two one color blue 我本来应该将第一个 div 颜色设置为红
  • jsFiddle onload 和 no-wrap 在 body 中

    我正在尝试开始使用 jsFiddle 所以我尝试运行一个简单的代码片段 其中包括所有 HTML CSS 和 JavaScript 代码 如果我在框架和扩展下拉列表中选择 onLoad Javascript 不起作用 但当我从下拉列表中选择
  • 从 MySQL 列确定 mime 类型

    我收到了从 MSAccess 导出的数据库 不是我最喜欢的 并将其导入到 MySQL 表中 有一个名为 customerImage 的列 是 long BLOB 类型 属性为 binary 如何确定 Mime 类型 我尝试过不同的方法 但所
  • 如何在 JavaConfig 中设置 jsp-config

    在 web xml 中
  • numpy 中按数字求和数组

    假设我有一个 numpy 数组 例如 1 2 3 4 5 6 和另一个数组 0 0 1 2 2 1 我想按组 第二个数组 对第一个数组中的项目求和 并按组编号顺序获取 n 组结果 在本例中结果将是 3 9 9 我如何在 numpy 中做到这
  • 科学计数法颜色条

    我正在尝试使用 matplotlib 将颜色条添加到我的图像中 当我尝试强制以科学记数法书写刻度标签时 问题就出现了 如何在颜色条的刻度中强制使用科学计数法 即 1x10 0 2x10 0 1x10 2 等 例如 让我们使用颜色条创建并绘制
  • 对象不支持属性或方法“selectbox”

    我正在使用 selectbox jQuery 插件http www bulgaria web developers com projects javascript selectbox 我还有一个链接的js文件 其中包含以下代码 functi
  • 自定义 Django Admin:在父 Add_View 上添加多个默认内联

    我有一个管理模型 其中包含一些内联模型 请参阅资源用户管理全班型号如下 inlines ResourceLocationInlineAdmin ResourceCategoryInlineAdmin ResourceStageInlineA