Django хранит регулярное выражение в БД, которое затем оценивается на странице - PullRequest
0 голосов
/ 18 марта 2010

Я хочу сохранить несколько шаблонов URL в моей модели django, которые пользователь может предоставить параметры, для которых будет создан URL.

Например, я мог бы сохранить эти 3 URL в моей базе данных, где% s - это переменный параметр, предоставленный пользователем:

  • www.thisissomewebsite.com? Пары =% 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)

Как лучше всего создать эти URL-адреса, заменив% s на переменную в базе данных.

это будет просто замена строки, например:

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

или есть лучший способ?

EDIT Также было бы неплохо, если бы пользователь мог сохранить одну переменную или список переменных, которые затем заменили бы число переменных в строке, например

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)

Спасибо

Ответы [ 3 ]

3 голосов
/ 18 марта 2010

ast.literal_eval() может использоваться для анализа строки в значение или структуру Python. Если это list, просто передайте его tuple() перед использованием интерполяции строк.

1 голос
/ 18 марта 2010
>>> 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 голосов
/ 18 марта 2010

Вы можете сделать это:

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), как предлагает Игнасио.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...