2010-03-18 33 views
0

上評估我想在我的django模型中存儲一些url模式,用戶可以提供參數以創建url。Django在DB中存儲正則表達式,然後在頁面

例如其中%s是由用戶所提供的可變參數I可以存儲在我的分貝這些3個網址:

  • www.thisissomewebsite.com?param=%s
  • www.anotherurl/%S/
  • www.lastexample.co.uk?param1=%s & fixedparam = 2

正如從這些例子中看到的參數可以在字符串中在固定位置的任何位置,不會出現。

我有2個型號,一個保存URL和一個持有變量:

class URLPatterns(models.Model): 
    pattern = models.CharField(max_length=255) 

class URLVariables(models.Model): 
    pattern = models.ForeignKey(URLPatterns) 
    param = models.CharField(max_length=255) 

什麼是通過與數據庫中的變量替換%s到產生這些URL的最佳途徑。

將它僅僅是一個簡單的字符串替換e.g:

urlvariable = URLVariable.objects.get(pk=1) 
pattern = url.pattern 
url = pattern.replace("%s", urlvariable.param) 

,或是否有更好的辦法?

編輯 如果用戶可以選擇存儲單個變量或一系列變量,然後這些變量將替換字符串中的多個變量,例如,

u = URLPatterns(pattern='www.url?param=%s&param2=%s&param3=%s') 
v = URLVariables(pattern=u, param='[2,6,3]') 

url = SOME WAY TO REPLACE THE 3 %s WITH THE 3 VARIABLES IN THE ARRAY (this would need to be converted from a string in someway) 

感謝

回答

1
>>> param = [2, 6, 3] 
>>> pattern = 'www.url?param=%s&param2=%s&param3=%s' 
>>> url = pattern % tuple(param) 
>>> url 
'www.url?param=2&param2=6&param3=3' 

如果PARAM就像字符串 '[2,6,3]'可以使用ast.literal_eval()或json.loads():

>>> ast.literal_eval('[2,6,3]') 
[2, 6, 3] 

>>> json.loads(param) 
[2, 6, 3] 

>>> simplejson.loads(param) 
[2, 6, 3] 
+0

這裏不需要'str()'。 '%s'通過'str()'隱式地推送參數。 – 2010-03-18 12:32:31

+0

謝謝你的str()和ast.literal_eval()更正! – 2010-03-18 12:40:31

0

你可以這樣做:

pattern="www.url?param=%s&param2=%s&param3=%s" 
params = "[1, 2, 3]" 

url = pattern % tuple(s.strip('[] ') for s in params.split(',')) 

或使用ast.literal_eval(params)作爲伊格納西奧建議。

3

ast.literal_eval()可用於將字符串解析爲Python值或結構。如果是list,那麼只需在使用字符串插值之前將它傳遞給tuple()即可。