Возвращение пути к файлу в Django без расширения файла - PullRequest
4 голосов
/ 11 января 2012

Я создаю мультимедийное приложение на своем сайте Django, которое позволяет пользователям загружать фотографии, видео и аудио - файлы кодируются сторонним сервисом (mp4, ogg, webm и flv для видео), а затем сохраняются введро пользователя на Amazon S3.Я специально ищу элегантное решение для отображения видео пользователя в формате HTML5.Вот как выглядит моя модель:

class Video(models.Model):
    file = models.FileField(upload_to = user_video_folder)
    owner = models.ForeignKey(User)
    video_title = models.CharField(max_length=100)
    video_caption = models.CharField(max_length=150, blank=True)
    date_added = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)
    def __unicode__(self):
    return self.video_title

Затем представление:

def ViewAllVideos(request):
    videos = Video.objects.filter(owner = request.user)
    template = 'site/media-videos.html'
    return render_to_response(template, {'videos': videos}, context_instance=RequestContext(request))

В шаблоне мне нужно напечатать путь для нескольких форматов файлов, которые генерируются во время кодирования, иЯ надеялся, что мне не нужно будет добавлять столбец для каждого формата в моей модели, поэтому мне было интересно, есть ли способ вернуть путь к файлу С именем файла, но без расширения, поэтому он хотел быкак в шаблоне:

<video width="900" height="506" preload="" controls="" autoplay="">
    <source src="{{ STATIC_URL }}{{ video.file }}.mp4" type="video/mp4;">
    <source src="{{ STATIC_URL }}{{ video.file }}.ogg" type="video/ogg;">
    <source src="{{ STATIC_URL }}{{ video.file }}.webm" type="video/webm;">
    <object width="900" height="506" type="application/x-shockwave-flash" data="/foo/bar/flowplayer/flowplayer-3.2.5.swf">
        <param name="movie" value="/foo/bar/flowplayer/flowplayer-3.2.5.swf"><param name="allowfullscreen" value="true">
        <param value="config={"clip": {"url": "{{ STATIC_URL }}{{ video.file }}.flv", "autoPlay":false, "autoBuffering":true}}" name="flashvars">
    </object>
</video>

Любая помощь приветствуется!Ура!


Вот мой новый взгляд:

def ViewAllVideos(request):
    videos = Video.objects.filter(owner = request.user)
    filenames = [os.path.splitext(os.path.basename(video.file))[0]
        for video in videos]
    context = {
        'videos': videos,
        'filenames': filenames,}
    template = 'site/media-videos.html'
    return render_to_response(template, context, context_instance=RequestContext(request))

Ответы [ 2 ]

4 голосов
/ 11 января 2012

Вы можете добавить что-то похожее на приведенное ниже в вашей модели, а затем использовать {{video.file_minus_extension}}

def file_minus_extension(self): 
    basename, extension = os.path.splitext(self.file.url) 
    return basename

РЕДАКТИРОВАТЬ: согласно комментарию, просто вернуть имя файла

def filename_minus_extension(self): 
    basename, extension = os.path.splitext(os.path.basename(self.file.name)) 
    return basename
0 голосов
/ 11 января 2012

Я думаю, что вы ищете что-то вроде:

os.path.splitext('file.ext')[0]  # Will return just 'file'

Примечание: это должно быть выполнено в вашем представлении, а возвращаемое значение передано вашему шаблону.

Например, на ваш взгляд, вы можете сделать что-то вроде:

filenames = [os.path.splitext(os.path.basename(video.file))[0]
             for video in vides]
...
context = {'videos': videos,
           'filenames': filenames,
          }
return render_to_response(template, context, ...)

Я думаю, вы просто используете video.file в своем шаблоне, так что, возможно, вы даже можете не передавать его в шаблон, так какэто не понадобится.

...