2010-03-18 4 views
0

Je veux stocker un certain nombre de modèles d'URL dans mon modèle django qu'un utilisateur peut fournir des paramètres pour créer une URL.Expression régulière de Django stockée dans DB qui est ensuite évaluée sur la page

Par exemple, je pourrais stocker ces 3 urls dans ma db où% s est le paramètre variable fournie par l'utilisateur:

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

Comme vous pouvez le voir dans ces exemples, le paramètre peut apparaître n'importe où dans la chaîne et non dans une position fixe.

J'ai 2 modèles, on tient les urls et on tient les variables:

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

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

Quelle serait la meilleure façon de générer ces urls en remplaçant le% s avec la variable dans la base de données.

serait-il juste un simple remplacement sur la chaîne par exemple:

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

ou est-il une meilleure façon?

EDIT Il serait également intéressant que l'utilisateur puisse choisir de stocker une seule variable ou une liste de variables qui remplacerait alors un certain nombre de variables dans la chaîne, par ex.

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) 

Merci

Répondre

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' 

si est une param chaîne comme '[2,6,3]' vous pouvez utiliser ast.literal_eval() ou json.loads():

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

ou

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

ou

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

Ici, pas besoin de 'str()'. '% s' pousse implicitement le paramètre à l'aide de' str() '. –

+0

Merci pour les corrections str() et ast.literal_eval()! –

0

Vous pouvez le faire:

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

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

ou utiliser ast.literal_eval(params) comme le suggère Ignacio.

3

ast.literal_eval() peut être utilisé pour analyser une chaîne dans une valeur ou une structure Python. Si c'est un list alors il suffit de passer à tuple() avant d'utiliser l'interpolation de chaîne.

Questions connexes