在Django中使用方括号调用类,Python

2 投票
4 回答
660 浏览
提问于 2025-04-17 21:38

这段代码来自djangoproject.com的教程。有人能解释一下为什么这一行是这样写的吗:

inlines =[ChoiceInline] 

而不是

inlines = ChoiceInline

为什么在类ChoiceInline周围有方括号呢?


from django.contrib import admin
from naslovnica.models import Poll
from naslovnica.models import Choice

class ChoiceInline(admin.TabularInline):
    model = Choice
    extra = 3

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
    (None,               {'fields': ['question']}),
    ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines =[ChoiceInline]
    list_display = ('question', 'pub_date', 'was_published_recently')
    search_fields = ['question']
    list_filter = ['pub_date']

admin.site.register(Poll, PollAdmin)

4 个回答

1

它接收一个类的列表或元组,因为Django把它当作一个特殊的 ModelAdmin 类,类似于对 BaseModelAdmin 的扩展。

在内部,Django会实例化这些类,正如你在这里看到的:

def get_inline_instances(self, request, obj=None):
    inline_instances = []
    for inline_class in self.inlines:
        inline = inline_class(self.model, self.admin_site)
        if request:
            if not (inline.has_add_permission(request) or
                    inline.has_change_permission(request, obj) or
                    inline.has_delete_permission(request, obj)):
                continue
            if not inline.has_add_permission(request):
                inline.max_num = 0
        inline_instances.append(inline)

    return inline_instances

为了更好地理解,我建议你查看 django.contrib.admin 中的选项文件: https://github.com/django/django/blob/master/django/contrib/admin/options.py

1

“内联”是指一组 InlineModelAdmin、TabularInline 或 StackedInline。这让你可以为相关的模型添加“内联”表单。

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#inlinemodeladmin-objects

管理界面可以在同一页面上编辑父模型的相关模型,这些相关模型就叫做内联。

4

这不是“类调用”。它其实就是一个列表。你可以有多个内联,所以用的是复数形式,而且你需要把它们放在一个列表或者元组里面。

1

inlines =[ChoiceInline] 这不是在调用一个类。这个操作会创建一个新的列表,列表的第一个元素是 class

如果要调用这个类的话,应该写成 ChoiceInline()

撰写回答