2012-01-11 3 views
3

Пожалуйста, голые со мной, я новичок в Django/Python, так что вполне может быть простым решением моей проблеме ...Возвращение путь к файлу в Django без расширения файла

Я создаю мультимедийное приложение на моем сайте 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

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

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

EDIT: согласно комментарию, просто возвращает имя файла

def filename_minus_extension(self): 
    basename, extension = os.path.splitext(os.path.basename(self.file.name)) 
    return basename 
+0

Это замечательно, спасибо! Единственная проблема, с которой я сталкиваюсь, заключается в том, что он возвращает полный путь к изображению, но мне нужно указать отдельный статический URL. Возможно ли ТОЛЬКО вернуть имя файла? Так, например: static.myurl.com/username/videos/foo.mp4 вернет: foo –

0

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

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 в шаблоне, поэтому, возможно, вы даже можете не передать его в шаблон, так как ему не понадобится.

+0

Эй, спасибо за комментарий! Как я уже упоминал, я новичок в Django, поэтому простите меня, если я не пойму правильно ... Итак, вы говорите, что это должно быть на мой взгляд, поэтому, основываясь на моем первоначальном представлении, как бы это выглядело? Еще раз спасибо! –

+0

Я отредактировал свой ответ, чтобы привести пример. Кстати, я видел ваш комментарий о получении только имени файла. Это можно сделать, используя 'os.path.basename'. – jcollado

+0

Спасибо! Так вот мой новый взгляд: Защиту ViewAllVideos (запрос): \t видео = Video.objects.filter (владелец = request.user) \t имена файлов = [os.path.splitext (os.path.basename (видео.файл)) [0] \t \t для видео в видео] \t контекста = { \t \t 'видео': видео, \t \t 'имена файлов': имена файлов} \t шаблон = «сайт/медиа-videos.html ' \t возвращение render_to_response (шаблон, контекст, context_instance = RequestContext (запрос)) ... однако я получаю следующее сообщение об ошибке при попадании на странице: AttributeError в/сайте/медиа/видео/ 'объекта FieldFile' имеет нет атрибута 'rfind' Любые мысли? –