Вопрос

Я хочу создать несколько мини-CMS, которые содержат страницы с URI.

Последний маршрут в моем urls.py указывает на функцию в моем view.py, которая проверяет в хранилище данных, доступна ли страница с тем же uri текущего запроса, и если да, показывает страницу.

У меня есть модель:

class Page(db.Model): 
  title = db.StringProperty(required=True) 
  uri = db.TextProperty(required=True) 
  created = db.DateTimeProperty(auto_now_add=True) 
  modified = db.DateTimeProperty(auto_now=True) 
  content = db.TextProperty() 

С моей точки зрения:

def show(request): 
  page = db.GqlQuery('SELECT * FROM Page WHERE uri=:uri', uri=request.path).get() 
  if page is None: 
    return http.HttpResponseNotFound() 
  else: 
    return respond(request, 'pages_show', {'content': request.path}) 

И я добавил объект с /work в качестве URI в хранилище данных.

Даже если request.path равен точно «/work», запрос не возвращает совпадения.

Спасибо за любой совет, который вы можете мне дать!

И да, я новичок в Python, App Engine идеально подходит для того, чтобы наконец выучить язык.

Это было полезно?

Решение

Я нашел решение!

Проблема кроется в модели.

Хранилище данных механизмов приложений не индексирует TextProperty.Использование этого типа было неправильным с самого начала, поэтому я изменил его на StringProperty, который индексируется и, следовательно, какое хранилище данных позволяет нам использовать в предложении WHERE.

Пример рабочей модели:

   class Page(db.Model): 
      title = db.StringProperty(required=True) 
      // string property now
      uri = db.StringProperty(required=True) 
      created = db.DateTimeProperty(auto_now_add=True) 
      modified = db.DateTimeProperty(auto_now=True) 
      content = db.TextProperty()

Другие советы

Если вы используете именованные аргументы ключевого слова («uri=:uri»), вам необходимо явно привязать свои параметры к именованному ключевому слову.Вместо:

# incorrect named parameter
GqlQuery('SELECT * FROM Page WHERE uri=:uri', request.path).get()

вы хотите

# correct named parameter
GqlQuery('SELECT * FROM Page WHERE uri=:uri', uri=request.path).get()

или вы можете просто использовать позиционный параметр:

# correct positional parameter
GqlQuery('SELECT * FROM Page WHERE uri=:1', request.path).get()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top