如何按数据存储支持这些复选框



我想将复选框值保存到数据库中,并在Google Appengine项目中使用它们。 我之前的问题是关于将其存储到会话中。我修改了这个简单的谷歌项目。但无法得到这项工作。它保存留言簿条目,但不保存复选框。

这是 HTML:

      <html>
  <body>
    {% for greeting in greetings %}
      {% if greeting.author %}
        <b>{{ greeting.author }}</b> wrote:
      {% else %}
        An anonymous person wrote:
      {% endif %}
      <blockquote>{{ greeting.content|escape }}</blockquote>
    {% endfor %}
    <form action="/sign" method="post">
<input type="checkbox" id="opt1" name="option 1" {% if not greetings.opts or "option 1" in greetings.opts %}checked="1"{% endif %} /><span class="font90" style="cursor:default;" >{{("Option 1")}} </span>
<input type="checkbox" id="opt2" name="option 2" {% if not greetings.opts or "option 2" in greetings.opts %}checked="1"{% endif %} /><span class="font90" style="cursor:default;" >{{("Option 2")}}</span>

      <div><textarea name="content" rows="3" cols="60"></textarea></div>
      <div><input type="submit" value="Sign Guestbook"></div>
    </form>
    <a href="{{ url }}">{{ url_linktext }}</a>
    <br>
    <br>

  <br>
  </body>
</html>

helloword.py:

import urllib
import webapp2
from google.appengine.ext import db
from google.appengine.api import users
import jinja2
import os
jinja_environment = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)))

class Greeting(db.Model):
  """Models an individual Guestbook entry with an author, content, and date."""
  opts=db.StringListProperty()
  author = db.StringProperty()
  content = db.StringProperty(multiline=True, indexed=False)
  date = db.DateTimeProperty(auto_now_add=True)

def _GuestbookKey(guestbook_name=None):
  """Constructs a Datastore key for a Guestbook entity with guestbook_name."""
  return db.Key.from_path('Guestbook', guestbook_name or 'default_guestbook')

class MainPage(webapp2.RequestHandler):
  def get(self):  # pylint:disable-msg=invalid-name
    """Handle GET requests."""
    guestbook_name = self.request.get('guestbook_name')
    greetings_query = Greeting.all().ancestor(
        _GuestbookKey(guestbook_name)).order('-date')
    greetings = greetings_query.fetch(10)
    if users.get_current_user():
      url = users.create_logout_url(self.request.uri)
      url_linktext = 'Logout'
    else:
      url = users.create_login_url(self.request.uri)
      url_linktext = 'Login'
##    opt=self.request.get('opts',[])

    template_values = {
        'greetings': greetings,
        'url': url,
        'url_linktext': url_linktext,
    }
##    'opts': dict.fromkeys(opt, 'checked')
    template = jinja_environment.get_template('index.html')
    self.response.out.write(template.render(template_values))

class Guestbook(webapp2.RequestHandler):
  def post(self):  # pylint:disable-msg=invalid-name
    """Handle POST requests."""
    # We set the same parent key on the 'Greeting' to ensure each greeting is in
    # the same entity group. Queries across the single entity group will be
    # consistent. However, the write rate to a single entity group should
    # be limited to ~1/second.
    guestbook_name = self.request.get('guestbook_name')
    greeting = Greeting(parent=_GuestbookKey(guestbook_name))
    if users.get_current_user():
      greeting.author = users.get_current_user().nickname()
    allopts=['option 1','option 2','option 3']
    greeting.opts=[op for op in allopts if self.request.get(op)]
##    greeting.opts=self.request.get("opts", allow_multiple=True)

    greeting.content = self.request.get('content')
    greeting.put()
    self.redirect('/?' + urllib.urlencode({'guestbook_name': guestbook_name}))

APP = webapp2.WSGIApplication([
    ('/', MainPage),
    ('/sign', Guestbook),
], debug=True)

尽管存在所有剩余的缺陷,但编辑后的这段代码确实保存了选中复选框的列表——它永远不会显示它们,因为在模板中它检查greetings.opts不存在,而不是在定义greeting单数的循环检查greeting.opts(在.之前没有s)。

因此,例如将模板的心脏更改为

    {% for greeting in greetings %}
      {% if greeting.author %}
        <b>{{ greeting.author }}</b> wrote:
      {% else %}
        An anonymous person wrote:
      {% endif %}
      <blockquote>{{ greeting.content|escape }}</blockquote>
<input type="checkbox" name="option 1" {% if not greeting.opts or "option 1" in greeting.opts %}checked="1"{% endif %} /><span class="font90" style="cursor:default;" >{{("Option 1")}} </span>
<input type="checkbox" name="option 2" {% if not greeting.opts or "option 2" in greeting.opts %}checked="1"{% endif %} /><span class="font90" style="cursor:default;" >{{("Option 2")}}</span>
      <p><p>
    {% endfor %}
    <p><p>
    <form action="/sign" method="post">

将在每次问候语后立即显示两个复选框设置或取消设置,具体取决于提交该问候语表单时的情况。

还有许多小问题(例如,严格来说,HTML有checked=1是错误的,但浏览器通常会忽略这些错误),其中最糟糕的是使用古老的db而不是漂亮的新ndb

但是,模板中的此更改(加上我之前在评论中提到的所有错误以及您的编辑现已修复)似乎确实回答了这个问题。

最新更新