#python #html #google-app-engine #google-cloud-datastore
# #python #HTML #google-app-engine #google-облако-хранилище данных
Вопрос:
Я пробую эту идею, когда на странице «/ search» есть таблица «событий», и когда нажата кнопка «ПЕРЕЙТИ» к событию, она увеличивает количество «RSVP» этого события и перенаправляет обратно на «/ search». Однако, когда я нажал на кнопку «ПЕРЕЙТИ» в своем приложении, это приводит к пустому экрану с URL ‘localhost: 8080 / rsvp’.
Нахожу это странным и задаюсь вопросом, какая часть моего кода неверна. Вот некоторые из соответствующих частей кода, которые, по моему мнению, вызывают ошибку.
Это код из файла python:
class RSVPItem(webapp2.RequestHandler):
# increment RSVP count when GO button is clicked
def post(self):
itemkey = ndb.Key('Items', self.request.get('itemid'))
item = itemkey.get()
item.rsvp = item.rsvp 1
item.put()
self.redirect('/search')
# Handler for the Search page
class Search(webapp2.RequestHandler):
# Display search page
def get(self):
user = users.get_current_user()
if user: # signed in already
# Retrieve items
query = ndb.gql("SELECT * "
"FROM Items ")
template_values = {
'user_mail': users.get_current_user().email(),
'logout': users.create_logout_url(self.request.host_url),
'items': query,
}
template = jinja_environment.get_template('search.html')
self.response.out.write(template.render(template_values))
else:
self.redirect(self.request.host_url)
app = webapp2.WSGIApplication([('/', MainPage),
('/giftbook', MainPageUser),
('/wishlist', WishList),
('/deleteitem', DeleteItem),
('/search', Search),
('/rsvp', RSVPItem),
('/display', Display),
('/displaytag', Displaytag)],
debug=True)
Это из HTML-файла для ‘search.html «. Показывается только та часть, которую я считаю актуальной.
<h4> Events List </h4>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th width="10%">Name</th>
<th>Description</th>
<th width = "10%">Link</th>
<th width = "10%">Date</th>
<th width = "10%">Type</th>
<th width = "10%">RSVP</th>
<th width = "10%">Rolling?</th>
</tr>
</thead>
<tbody>
{% for item in items %}
<tr>
<td>{{ item.event_name }} </td>
<td>{{ item.description }}</td>
<td>{{ item.event_link}}</td>
<td>{{ item.date.strftime('%Y-%m-%d') }}</td>
<td>{{ item.event_type}}</td>
<td>{{ item.rsvp }}
<td>
<form action="/rsvp" method="post">
<input type="hidden" name="itemid" value="{{ item.item_id }}">
<input type="submit" value="GO!">
</form></td>
</tr>
{% endfor %}
</tbody>
</table>
Ответ №1:
<form action="/rsvp" method="post">
отправляет их /rsvp
. У вас есть обработчик URL для /rsvp
?
Убедитесь, что вы привели Key
к int
:
itemkey = ndb.Key('Items', int(self.request.get('itemid')))
Вместо того, чтобы устанавливать свой собственный идентификатор item_id
, просто используйте встроенный Key
:
<input type="hidden" name="itemid" value="{{ item.key.id() }}">
Проверьте журналы, чтобы увидеть, есть ли какие-либо ошибки.
Комментарии:
1. о, да, у меня есть. Я отредактирую свой пост и добавлю эту часть своего кода выше.
2. о, в журналах у меня есть это: AttributeError: объект ‘NoneType’ не имеет атрибута ‘rsvp’…. Что это значит??
3. Это означает, что он не нашел соответствия запросу. Убедитесь, что вы привели идентификатор ключа к an
int
, как я указал в ответе. Он отображается в форме в виде строки, поэтому не может соответствоватьKey
в запросе.4. хммм, но я также отредактировал строку кода на ‘itemkey = ndb.Key(‘Items’, int(self.request.get(‘itemid’)))’ и я также установил item_id = ndb. IntegerProperty() . Однако я все равно получил ту же ошибку
5. Подождите.
item_id
это ваше собственное пользовательское свойство.ndb.Key
это ключ хранилища данных. 2 разные вещи. Вы получаете объектKey
(лучшим, наиболее эффективным способом). Если вы хотите получить его с помощьюitem_id
, вам нужно запросить его. См. Отредактированный ответ