在Django中使用方括号调用类,Python
这段代码来自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()
。