我想在我的django模型中存储一些url模式,用户可以提供参数来创建URL。
例如,我可能会在我的数据库中存储这3个网址,其中%s是用户提供的变量参数:
从这些示例中可以看出,参数可以出现在字符串中的任何位置,而不是固定位置。
我有两个模型,一个持有网址,另一个持有变量:
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的最佳方法是什么。
它只是对字符串的简单替换,例如:
urlvariable = URLVariable.objects.get(pk=1)
pattern = url.pattern
url = pattern.replace("%s", urlvariable.param)
还是有更好的方法吗?
EDIT 如果用户可以选择存储单个变量或变量列表,然后替换字符串中的多个变量,那也很好。
u = URLPatterns(pattern='www.url?param=%s¶m2=%s¶m3=%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)
由于
答案 0 :(得分:3)
ast.literal_eval()
可用于将字符串解析为Python值或结构。如果它是list
,则在使用字符串插值之前将其传递给tuple()
。
答案 1 :(得分:1)
>>> param = [2, 6, 3]
>>> pattern = 'www.url?param=%s¶m2=%s¶m3=%s'
>>> url = pattern % tuple(param)
>>> url
'www.url?param=2¶m2=6¶m3=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]
答案 2 :(得分:0)
你可以这样做:
pattern="www.url?param=%s¶m2=%s¶m3=%s"
params = "[1, 2, 3]"
url = pattern % tuple(s.strip('[] ') for s in params.split(','))
或使用ast.literal_eval(params)
作为Ignacio建议。