Maa*_*att 2 django django-models django-admin
我认为这是一个最容易理解的例子:
我有模型Image
和ImageType
,其中和图像只有一种类型。参数ImageType
将调节图像大小、缩略图大小等,因为照片库图像的显示可能与个人资料图片不同。
我希望个人资料图片和图库图片在 Django 管理站点中显示为单独的模型。一种选择是做这样的事情:
class ProfileImage (Image):
pass
class GalleryImage (Image):
pass
class ProfileImageAdmin (ImageAdmin):
def queryset(self, request):
qs = super(MyModelAdmin, self).queryset(request)
return qs.filter(type='profile')
class GalleryImageAdmin (ImageAdmin):
def queryset(self, request):
qs = super(MyModelAdmin, self).queryset(request)
return qs.filter(type='gallery')
admin.site.register(ProfileImage, ProfileImageAdmin)
admin.site.register(GalleryImage, GalleryImageAdmin)
Run Code Online (Sandbox Code Playgroud)
但是,除了拥有冗余代码之外,这完全违背了拥有数据库来组织这些代码的初衷。另一种选择是丢失 myImage
和ImageType
模型并为每种类型(即ProfileImage
和GalleryImage
)创建单独的几乎相同的表,但更糟糕的是,因为这将需要用户访问配置文件,在我看来这几乎违背了目的一个 CMS。
有什么办法可以做这样的事情吗?
admin.site.register(Image, ImageAdmin, group_by='type')
Run Code Online (Sandbox Code Playgroud)
或者,如果这是不可能的,是否有人对我可以解决的其他方法有任何建议?(比如python中有没有办法根据数据库动态创建类?)
干杯! 马特
有一种方法。这涉及对一种(或两种)类型的图像使用代理模型。然后,您可以为两者添加单独的管理员。例如
# models.py
class ProfileImage (Image):
class Meta:
proxy = True
class GalleryImage (Image):
class Meta:
proxy = True
Run Code Online (Sandbox Code Playgroud)
这将避免创建新表。您仍然会将所有数据存储在与Image
模型对应的表中。然后,您可以为这些代理注册两个不同的管理员。
# admin.py
class ProfileImageAdmin (ImageAdmin):
def queryset(self, request):
qs = super(MyModelAdmin, self).queryset(request)
return qs.filter(type='profile')
class GalleryImageAdmin (ImageAdmin):
def queryset(self, request):
qs = super(MyModelAdmin, self).queryset(request)
return qs.filter(type='gallery')
admin.site.register(ProfileImage, ProfileImageAdmin)
admin.site.register(GalleryImage, GalleryImageAdmin)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1885 次 |
最近记录: |