admin.py
でオブジェクトを追加すると、オブジェクトを追加する前に追加のロジックを実行するにはどうすればよいですか?値Video Intro
があるかLocation
下の注意をモデルオブジェクトを追加してdjangoでデータベースを更新する前のロジックを実行する
:
例えば、私は管理者の中にADD MEDIA
ボタンをクリックして、メディアオブジェクトを追加します。その値が1回だけ表示されるようにします。存在する場合は、Location
の値をNone
に変更します。
新しいモデルオブジェクトを追加する前に、このロジックを実行します。変更を行う場所とその方法を今すぐ確認してください。ここで
は、プロジェクト構造である:ここで
は私admin.py
次のとおりです。ここで
class MediaAdmin(admin.ModelAdmin):
search_fields = ["name", "file"]
list_display = ("name", "media_type", "location", "url", "album", "display", "thumbnail", "filesize")
def display(self, media_obj):
return format_html('<a href="%s">%s</a>' % (media_obj.file.url, media_obj.file.name))
def filesize(self, media_obj):
return self.convert_size(media_obj.file.size)
def convert_size(self, size):
if (size == 0):
return '0 B'
size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
i = int(math.floor(math.log(size,1024)))
p = math.pow(1024,i)
s = round(size/p,2)
return '%s %s' % (s,size_name[i])
def thumbnail(self, media_obj):
# pdb.set_trace()
# location = os.path.join(settings.MEDIA_URL, media_obj.file.name)
location = media_obj.file.url
thumbnail_html = "<a href=\"{0}\"><img border=\"0\" alt=\"\" src=\"{1}\" height=\"80\" /></a>".format(location, location)
return format_html(thumbnail_html)
class MediaInline(admin.TabularInline):
model = Media
class AlbumInline(admin.TabularInline):
model = Album
admin.site.register(Media, MediaAdmin)
admin.site.register(Album)
は私のmodels.py
class Media(models.Model):
LOCATION = (
("video_intro", "Video Intro"),
("logo", "Logo"),
(None, "")
)
TYPE = (
("video", "Video"),
("gif", "GIF"),
("picture", "Picture"),
("audio", "Audio")
)
name = models.CharField(max_length=50, blank=True)
location = models.CharField(choices=LOCATION, default=None, max_length=500, null=True)
uploaded = models.DateTimeField(auto_now_add=True)
media_type = models.CharField(max_length=50, choices=TYPE, default=None)
album = models.ForeignKey('Album', blank=True, null=True)
file = models.FileField(upload_to="media/")
url = models.CharField(max_length=2083, blank=True, null=True, default=None)
description = models.TextField(blank=True)
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "Media"
'Media'モデルの' .save() 'メソッドをオーバーライドすることができます。 https://docs.djangoproject.com/es/1.9/topics/db/models/#overriding-predefined-model-methods – Selcuk
オブジェクト作成時にのみチェックしたい場合は、 'self.pkがif None: '' save'のチェックコードに。 –