0

Просто для удовольствия я создаю сайт на Python и использую Google Datastore для создания веб-сайта, который позволяет пользователям публиковать название фильма и обзор фильма. Я также использую шаблоны Jinja2. Проблема в том, что movie_name записывается в базы данных во всех случаях, кроме одного, который находится в классе, который говорит MoviePage. Кажется, что это единственный класс, который не читает переменную movie_name, даже шаблон jinja не читает эту переменную. Однако у меня есть другие переменные в моем html, которые анализируются jinja2, только одна переменная, с которой я столкнулся. Вот мой код:Пользовательский ввод в Python не записывается в базу данных

class MovieReviews(db.Model): 
     movie_name = db.StringProperty() 
     review = db.TextProperty(required = True) 
     created = db.DateTimeProperty(auto_now_add = True) 
     last_modified = db.DateTimeProperty(auto_now = True) 

    class MoviesOnWebsite(db.Model): 
     movie_name = db.StringProperty(required = True) 
     created = db.DateTimeProperty(auto_now_add= True) 



    class AddMovie(StrHandler): 
     def get_front(self,movie_name="",error=""): 
     add_movie = db.GqlQuery("SELECT * FROM MoviesOnWebsite") 
     self.render("add-movie.html",movie_name=movie_name,error=error,add_movie=add_movie) 

     def get(self): 
     self.get_front() 

     def post(self): 
     haveError = False 
     movie_name = self.request.get("movie_name") 

     params = dict(movie_name=movie_name) 

     if not movie_name: 
      params['error_movie_name'] = "Must write movie name" 
      haveError = True 
     if haveError: 
      self.render("add-movie.html", **params) 
      self.response.out.write('You have errors') 
     else: 
      addmovie = MoviesOnWebsite(movie_name=movie_name) 
      addmovie.put() 
      site_url = urllib.urlencode(dict(movie_name=movie_name)) 
      self.redirect('/' + site_url) 

    class MoviePage(StrHandler): 
     def get_front(self, review="",error=""): 
     addmovie = AddMovie() 
     full_url = addmovie.site_url 
     movie_reviews = db.GqlQuery("SELECT * FROM MovieReviews") 
     self.render("movie_review_page.html", review=review,error=error,movie_reviews=movie_reviews) 

     def get(self,url): 
     self.get_front() 

     def post(self,url): 
     path = urlparse.urlparse(full_url).path 
     movie_name = self.request.get('movie_name') 
     review = self.request.get("review") 

     if review: 
     movie_rev = MovieReviews(path = path,review = review) 
     movie_rev.put() 

     else: 
     error = "You haven't submitted a review" 
     self.get_front(review,error) 

И небольшой фрагмент кода из моей страницы HTML называется movie_review_page.html, чтобы убедиться, что синтаксис дзиндзя правильно:

<body> 
    <h1>{{movie_name}}</h1> 
.... 

Я объясню, что делает мой код. Классы MovieReviews и MoviesOnWebsite - это только модели баз данных. Класс AddMovie позволяет пользователю добавлять фильм в базу данных, если никто никогда не отправлял обзор для этого конкретного фильма. После того, как пользователь добавит имя фильма в базу данных, они перенаправляются на URL-адрес, который выглядит следующим образом: www.websitename.com/nameOfMovie. И оттуда класс MoviePage имеет форму, которая позволяет пользователям добавлять название фильма и обзор и добавлять его в базу данных. Проблема, о которой я упоминал ранее, когда пользователь добавляет название фильма и обзор в классе MoviePage, только отчет записывается в базу данных, а заголовок фильма пуст. Название фильма, которое я хочу записать в базу данных, - это фильм, который пользователь делает для просмотра, а именно имя фильма, найденного в URL-адресе. movie_name только записывается в базу данных в классе AddMovie. И URL-адрес с дорогой, которая имеет название фильма, также работает. Проблема заключается в классе MoviePage. Следует отметить, что add-movie.html имеет текстовое поле с именем movie_name и movie_review_page.html. Если я изменю переменную от movie_name = self.request.get('movie_name') до movie_name="abcd", тогда abcd будет записана в базу данных, но это не сработает наоборот.

Буду признателен за любую помощь.

+0

Какой у вас веб-сайт? –

ответ

0

Я не уверен, что веб-каркас, который вы используете, но проблема, похоже, вызвана параметрами запроса vs url paramters.

Другие значения включены в форму и поэтому получены с self.request.get. Для имени фильма вы не можете использовать один и тот же вызов, вам нужно будет каким-то образом извлечь его из текущего URL-адреса, но это вызовет проблемы, если в вашем фильме есть нестандартные символы или пробелы.

Вместо URL закодировать параметр и включить его в перенаправлении:

Изменить редирект на это:

import urllib 
self.redirect('/?' + urllib.urlencode(dict(movie_name=movie_name)) 

Сгенерированный URL должен выглядеть /?movie_name=The%20Terminator

Затем извлечь данные, как так :

self.request.get("movie_name")

+0

Привет, Анарчи, спасибо за комментарий. Я использую webapp2 framework. Эта часть моего кода выглядит так: 'app = webapp2.WSGIApplication ([('/ ([a-zA-Z] | [0-9] | [$ -_ @. & +]) +', MoviePage) ], debug = True) '.У меня есть шаблон регулярного выражения, следующий за путём, чтобы взять любое имя фильма, которое может состоять из комбинации букв, цифр или символов. – Rebecca

+0

Я вижу, я обновил ответ с помощью некоторого кода, который вы можете попробовать. –

+0

Я заменил 'self.redirect', который я использовал с перенаправлением, используя urllib, но я получаю ошибку сервера. – Rebecca

Смежные вопросы