2016-04-14 6 views
0

admin.pyでオブジェクトを追加すると、オブジェクトを追加する前に追加のロジックを実行するにはどうすればよいですか?値Video IntroがあるかLocation下の注意をモデルオブジェクトを追加してdjangoでデータベースを更新する前のロジックを実行する

enter image description here

例えば、私は管理者の中にADD MEDIAボタンをクリックして、メディアオブジェクトを追加します。その値が1回だけ表示されるようにします。存在する場合は、Locationの値をNoneに変更します。

新しいモデルオブジェクトを追加する前に、このロジックを実行します。変更を行う場所とその方法を今すぐ確認してください。ここで

は、プロジェクト構造である:ここで

enter image description here

は私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" 
+2

'Media'モデルの' .save() 'メソッドをオーバーライドすることができます。 https://docs.djangoproject.com/es/1.9/topics/db/models/#overriding-predefined-model-methods – Selcuk

+1

オブジェクト作成時にのみチェックしたい場合は、 'self.pkがif None: '' save'のチェックコードに。 –

答えて

1

Use Unique Togetherモデルメタあるので、あなたそこには1つしかないと確信できますビデオイントロフロントエンドまたは管理インターフェース経由で追加されても問題ありません。

しかし、私はこのオプションはドロップダウンメニューを強制しないと思います。

+0

unique_togetherは、他のオブジェクトの値をNoneに書き換えるのではなく、検証エラーを発生させます。 – Xiflado

1

モデルの新しいインスタンス(テーブルの新しいレコード)の作成をカスタマイズする場合は、the save method of the modelをカスタマイズします。

saveメソッドは、(新規または変更された)インスタンスをデータベースに格納するために呼び出されます。他の処理を実行して、その保存イベントに「フック」することができます。

関連する問題