2013-12-11 34 views
5

我现在可以加载youtube的单个视频网址。但现在的问题是加载YouTube的播放列表视频。所以我的问题是,我如何替换两个相同的模式,但都有不同的URL替换?Django - 替换部分urlfield

如:

实际的URL:

<iframe width="400" height="327" src="http://www.youtube.com/embed/1UiICgvrsFI&amp;list=PLvAOICvbvsbnc5dLG0YR9Mq_tFfzAhQSp&amp;index=1" allowfullscreen="true"></iframe> 

更换模式变成这个样子:

<iframe width="560" height="315" src="//www.youtube.com/embed/1UiICgvrsFI?list=PLvAOICvbvsbnc5dLG0YR9Mq_tFfzAhQSp" allowfullscreen></iframe> 

这里先&amp;变化?和第二&amp;及其以下内容即&amp;index=1被剥离。

这是models.py:

class Video(models.Model): 
    title = models.CharField(max_length=100) 
    video_url = models.URLField(max_length=100) 

    def save(self, *args, **kwargs): 
     new_url = (self.video_url.replace("watch?v=","v/")) 
     super(Video, self).save(*args, **kwargs) 
     if new_url: 
      self.video_url = new_url 

编辑:所有的

def save(self, *args, **kwargs): 
     new_url = re.sub('watch\?v=','embed/',self.video_url) 
     new_url = re.sub(r'^(http:\/\/)([\w\W]+)\&amp;list=([\w\W]+)(\&amp;index=[\d]+)$', r'//\2?list=\3', new_url) 
     if new_url: 
      self.video_url = new_url 
      super(Video, self).save(*args, **kwargs) 

回答

3

首先,它似乎是你的URL进行编码。请检查您的模板中是否没有|urlencode筛选器(https://docs.djangoproject.com/en/dev/ref/templates/builtins/#urlencode)。

要将视频URL更改为播放列表URL,您必须使用正则表达式。您可以创建一个将改变你的视频网址到播放列表URL的方法:

import re 
... 
def playlist_url(self): 
    """ 
    Generates a playlist URL 
    """ 
    new_url = re.sub(r'^(http:\/\/)([\w\W]+)&list=([\w\W]+)(\&index=[\d]+)$', r'//\2?list=\3', self.video_url) 
    return new_url 
... 
+0

谢谢你的答案。我试过了,但是网址中还是有'&'。你能告诉我如何在正则表达式中做到这一点吗?请注意索引= 1可能会有所不同。再次感谢。 – Robin

+0

url和'http://'仍然有'&': http://www.youtube.com/embed/1UiICgvrsFI'&'list=PLvAOICvbvsbnc5dLG0YR9Mq_tFfzAhQSp – Robin

+0

它在控制台中工作,但我可以' t似乎在我的项目中工作......请你看看编辑,我也加了你的代码片段。 – Robin

1

可以使用HTMLParser.unescape功能转义网址:

>>> import HTMLParser 
>>> h = HTMLParser.HTMLParser() 
h.unescape("http://www.youtube.com/embed/1UiICgvrsFI&amp;list=PLvAOICvbvsbnc5dLG0YR9Mq_tFfzAhQSp&amp;index=1") 
'http://www.youtube.com/embed/1UiICgvrsFI&list=PLvAOICvbvsbnc5dLG0YR9Mq_tFfzAhQSp&index=1' 
+0

谢谢你的回答。请注意,根据用户上传,网址可能会有所不同。 – Robin

+0

@Robin你的意思是? – ndpu

+0

对不起,我的坏。但我也想删除'&'和'&index = ...'。 – Robin