mag*_*lli 8 django django-models django-admin
假设我有一个可以包含图像,视频和其他媒体类型的Post对象.我可以使用a GenericForeignKey
将它们链接在一起.就像是:
class Post(models.Model):
title = models.CharField(...)
text = models.TextField(...)
class AudioMedia(models.Model):
...
class VideoMedia(models.Model):
...
class ImageMedia(models.Model):
...
class MediaObject(models.Model):
post = models.ForeignKey(Post)
order = models.IntegerField()
content_type_media = models.ForeignKey(
ContentType, limit_choices_to={
'model__in': (
'audiomedia',
'imagemedia',
'videomedia')
})
object_id_media = models.PositiveIntegerField()
obj = generic.GenericForeignKey('content_type_media', 'object_id_media')
Run Code Online (Sandbox Code Playgroud)
现在我可以轻松创建一个管理界面,如:
class MediaObjectAdminInLine(admin.StackedInline):
model = MediaObject
ct_field = "content_type_media"
ct_fk_field = "object_id_media"
extra = 0
class PostAdmin(admin.ModelAdmin):
inlines = [MediaObjectAdminInLine]
Run Code Online (Sandbox Code Playgroud)
现在的问题:)在admin /中,我可以轻松创建一个新帖子.在帖子中,我可以轻松添加更多MediaObject.在面板中,我有一个下拉菜单来选择类型(音频,视频,...),但我必须手动输入我要与Post链接的对象的ID.
我尝试了各种扩展,包括grappelli.有些提供了查找要链接的对象ID的功能.我希望能够在这里添加对象,例如,添加AudioMedia,VideoMedia,ImageMedia,具体取决于我从下拉列表中选择的内容.
有什么建议?
你需要做很多工作才能实现这一目标.
要做到这一点,你必须:
听起来令人生畏?它是.
这是一个更简单的方法:
只需一个"媒体"模型.您将在模型上有一些仅对您的某种类型有效的字段(尽管有很多交叉).
将具有该媒体类型前缀的单个媒体类型特定的任何字段命名,即image_size', or
video_title`.
将JavaScript处理程序附加到ModelAdmin,它根据媒体类型的下拉列表选择性地显示和隐藏字段.像这样的东西:
class MediaAdmin(admin.ModelAdmin):
class Meta:
js = ["js/media-types.js",]
// media-type.js
(function($) {
$(document).ready(function(){
$('.module[id^=module] .row').hide();
$('.module[id^=module] .row.module').show();
$('.module[id^=module] .row.module select').each(function(){
if ($(this).val() != '')
{
var group = $(this).parent().parent().parent().parent();
var field = $(this).parent().parent().parent();
var mtype = $(this).val().toLowerCase();
if (mtype != '')
{
$('.row', group).not(field).slideUp('fast');
$('.row[class*="'+mtype+'"]', group).slideDown('fast');
$('.row[class*="all"]', group).slideDown('fast');
}
else
{
$('.row', group).not(field).slideUp('fast');
}
}
});
$('.module[id^=module] .row.module select').change(function(){
var group = $(this).parent().parent().parent().parent();
var field = $(this).parent().parent().parent();
var mtype = $(this).val().toLowerCase();
if (mtype != '')
{
$('.row', group).not(field).slideUp('fast');
$('.row[class*="'+mtype+'"]', group).slideDown('fast');
$('.row[class*="all"]', group).slideDown('fast');
}
else
{
$('.row', group).not(field).slideUp('fast');
}
});
});
})(django.jQuery);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2705 次 |
最近记录: |