【发布时间】:2012-08-21 09:00:43
【问题描述】:
我有一些这样的模型:
class BaseModel(models.Model):
created_by = models.ForeignKey(User, related_name="%(app_label)s_%(class)s_created")
created_date = models.DateTimeField(_('Added date'), auto_now_add=True)
last_updated_by = models.ForeignKey(User, related_name="%(app_label)s_%(class)s_updated")
last_updated_date = models.DateTimeField(_('Last update date'), auto_now=True)
class Meta:
abstract = True
class Image(BaseModel):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
name = models.CharField(_('Item name'), max_length=200, blank=True)
image = models.ImageField(_('Image'), upload_to=get_upload_path)
def save(self, *args, **kwargs):
if self.image and not GALLERY_ORIGINAL_IMAGESIZE == 0:
width, height = GALLERY_ORIGINAL_IMAGESIZE.split('x')
super(Image, self).save(*args, **kwargs)
filename = os.path.join( settings.MEDIA_ROOT, self.image.name )
image = PILImage.open(filename)
image.thumbnail((int(width), int(height)), PILImage.ANTIALIAS)
image.save(filename)
super(Image, self).save(*args, **kwargs)
class Album(BaseModel):
name = models.CharField(_('Album Name'), max_length=200)
description = models.TextField(_('Description'), blank=True)
slug = models.SlugField(_('Slug'), max_length=200, blank=True)
status = models.SmallIntegerField(_('Status'),choices=ALBUM_STATUSES)
images = generic.GenericRelation(Image)
我为我的所有模型使用 BaseModel 抽象模型来跟踪保存和更新日志。我可以使用 ModelAdmin 类自动设置用户字段:
class BaseAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
if not change:
obj.created_by = request.user
obj.last_updated_by = request.user
obj.save()
class AlbumAdmin(BaseAdmin):
prepopulated_fields = {"slug": ("name",)}
list_display = ('id','name')
ordering = ('id',)
这行得通。所有 BaseAdmin 字段都会自动填写。但我想通过内联将图像添加到相册。所以,我像这样更改我的 admin.py:
from django.contrib.contenttypes import generic
class ImageInline(generic.GenericTabularInline):
model = Image
extra = 1
class AlbumAdmin(BaseAdmin):
prepopulated_fields = {"slug": ("name",)}
list_display = ('id','name')
ordering = ('id',)
inlines = [ImageInline,]
当我保存页面时,出现错误:gallery_image.created_by_id may not be NULL 在图像模型保存方法的第一行 super(Image, self).save(*args, **kwargs) 上。我知道这是因为 GenericTabularInline 类没有要覆盖的“save_model”方法。
那么,问题是,如何在 InlineModelAdmin 类上覆盖 save 方法并设置当前用户?
【问题讨论】:
-
从本文档中,GenericTabularInline 继承自 InlineModelAdmin docs.nullpobug.com/django/trunk/… 并且您可以指定 InlineModelAdmin docs.djangoproject.com/en/dev/ref/contrib/admin/… 中使用的表单可能您可以覆盖它默认使用的 ModelForm 并添加初始值? stackoverflow.com/questions/2988548/…
标签: django django-models django-forms django-admin