首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在fieldset中显示Django管理内联模型?

如何在fieldset中显示Django管理内联模型?
EN

Stack Overflow用户
提问于 2013-08-23 04:54:28
回答 2查看 26K关注 0票数 39

考虑下面的ModelAdmin。在本例中,我希望在"None“字段集和Notes字段集之间显示内联的"Book”UI。这有可能吗?

代码语言:javascript
复制
class AuthorAdmin(admin.ModelAdmin):
    inlines = [BookInline]

    fieldsets = (
            (None, {
                'fields': ('author_name', 'date_of_birth')
            }),
            ('Notes', {
                'fields': (['notes'])
            }),
    )
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-19 21:46:06

不幸的是,这在django (标准模板)中是不可能的。如果查看字段集的模板,就会发现内联总是在change_form之后单独呈现:https://github.com/django/django/blob/master/django/contrib/admin/templates/admin/change_form.html

我看到的唯一解决办法是根据您想要的顺序编写一个自定义模板。

票数 14
EN

Stack Overflow用户

发布于 2017-12-28 18:10:21

我已经构建了另一个非常通用的解决方案。

在admin.py中,向内联添加一个新字段:

代码语言:javascript
复制
class YourModelInline(admin.TabularInline):
    model = YourModel
    after_field = "fieldname_of_field_before_inline"

然后定制包含内联的模型的AdminClass的render_change_form:

代码语言:javascript
复制
class EditModelAdmin(model.ModelAdmin):
    inlines = [YourModelInline,]

    def render_change_form(self, request, context, add=False, change=False, form_url='', obj=None):
        sorted_inline_formsets = {}
        inline_admin_formsets = context['inline_admin_formsets']
        formsets_to_remove = []

        for inline_formset in inline_admin_formsets:
            if hasattr(inline_formset.opts, 'after_field'):
                fieldname = inline_formset.opts.after_field
                if fieldname in sorted_inline_formsets:
                    sorted_inline_formsets[fieldname].append(inline_formset)
                else:
                    sorted_inline_formsets.update({
                        fieldname: [inline_formset,]
                    })
                formsets_to_remove.append(inline_formset)
        for inline_formset in formsets_to_remove:
            inline_admin_formsets.remove(inline_formset)

        context.update({
            'sorted_inline_formsets': sorted_inline_formsets,
            'inline_admin_formsets': inline_admin_formsets
        })
        return super(EditModelAdmin, self).render_change_form(request, context, add=add,
                                                       change=change, obj=obj, form_url=form_url)

我们正在将所有带有额外字段的内联移动到自己的字典中,并使用fieldname作为关键字...为了正确地呈现它,创建文件/templates/admin/includes/fieldset.html,它用以下内容覆盖标准的django fieldset.html:

代码语言:javascript
复制
{% load custom_filter %}
<fieldset class="module aligned {{ fieldset.classes }}">
        {% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
        {% if fieldset.description %}
            <div class="description">{{ fieldset.description|safe }}</div>
        {% endif %}
        {% for line in fieldset %}
            <div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% if not line.has_visible_field %} hidden{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}">
                {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %}
                {% for field in line %}
                    <div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}{% if field.field.is_hidden %} hidden{% endif %}"{% elif field.is_checkbox %} class="checkbox-row"{% endif %}>
                        {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
                        {% if field.is_checkbox %}
                            {{ field.field }}{{ field.label_tag }}
                        {% else %}
                            {{ field.label_tag }}
                            {% if field.is_readonly %}
                                <div class="readonly">{{ field.contents }}</div>
                            {% else %}
                                {{ field.field }}
                            {% endif %}
                        {% endif %}
                        {% if field.field.help_text %}
                            <div class="help">{{ field.field.help_text|safe }}</div>
                        {% endif %}
                    </div>
                    {% if field.field.name %}
                        {% with field.field.name as fieldname %}
                            {% if sorted_inline_formsets|get_dict_value:fieldname != False %}
                                {% for inline_admin_formset in sorted_inline_formsets|get_dict_value:fieldname %}
                                    {% include inline_admin_formset.opts.template %}
                                {% endfor %}
                            {% endif %}
                        {% endwith %}
                    {% endif %}
                {% endfor %}
            </div>
        {% endfor %}
    </fieldset>

这将在相应字段后添加已排序的内联...现在您只需要在django模板中使用字典的custom_filter,创建templatetags/custom_filter.py并添加:

代码语言:javascript
复制
@register.filter
def get_dict_value(dict, key):
    if key in dict:
        return dict[key]
    else:
        return False

瞧:你可以在任何内联中输入任何字段名,将其添加到该字段之后……它的设置有点麻烦,但如果你有几个内联排序,它可能是一种更干净的方式……

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18390627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档