3

(少なくとも、これは私が考えていることです)が原因で、アプリでエラーが発生していますが、その%s理由はわかりません。HTMLテンプレートにデータを取得しようとするために、djangoコードに変更しました。テンプレートはロードされていますが、データはインポートされていません。アプリはローカルで実行されますが、テンプレートがデータを読み込んでおらず、サーバーで次のエラーが発生します。

Traceback (most recent call last):
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1536, in __call__
    rv = self.handle_exception(request, response, e)
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1530, in __call__
    rv = self.router.dispatch(request, response)
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "/base/python27_runtime/python27_lib/versions/third_party/webapp2-2.5.1/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "/base/data/home/apps/s~ceemee11111/1.363684484611202021/helloworld.py", line 37, in get
    for greeting in greetings:
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 2314, in next
    return self.__model_class.from_entity(self.__iterator.next())
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 1442, in from_entity
    return cls(None, _from_entity=entity, **entity_values)
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 974, in __init__
    prop.__set__(self, value)
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 614, in __set__
    value = self.validate(value)
  File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 2823, in validate
    raise BadValueError('Property %s is not multi-line' % self.name)
BadValueError: Property content is not multi-line

helloworld.py:

import cgi
import datetime
import urllib
import webapp2
import os

from google.appengine.ext import db
from google.appengine.api import users
from google.appengine.ext.webapp import template



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


def guestbook_key(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):
    self.response.out.write('<html><body>')
    guestbook_name=self.request.get('guestbook_name')

    greetings = db.GqlQuery("SELECT * "
                        "FROM Greeting "
                        "WHERE ANCESTOR IS :1 "
                        "ORDER BY date DESC LIMIT 10",
                        guestbook_key(guestbook_name))

    for greeting in greetings:
      if greeting.author:
        self.response.out.write(
            '<b>%s</b> wrote:' % greeting.author)
      else:
        self.response.out.write('An anonymous person wrote:')

      self.response.out.write(template.render('myhtml.html', {'guestbook_name': guestbook_name}))

class Guestbook(webapp2.RequestHandler):
  def post(self):
    guestbook_name = self.request.get('guestbook_name')
    greeting = Greeting(parent=guestbook_key(guestbook_name))

    if users.get_current_user():
      greeting.author = users.get_current_user().nickname()

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


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

myhtml.html:

<!DOCTYPE html>
  <html>
    <body>
      <form action="/sign?{{ guestbook_name }}" method="post">
       <div id="dataImput">
        <div><div><input type="text" name="content"</div>
        <div><div><input type="text" name="content2"</div>
      </div> 
      <script>
        document.write("<h1>This is heading</h1>");

      </script>
        <div><input type="submit" value="Sign Guestbook"></div>
      </form>
      <form>Guestbook name: <input value="{{ guestbook_name|escape }}" name="guestbook_name">
  <input type="submit" value="switch"></form>
  <hr>
</body>

4

4 に答える 4

1

私はグーグルアプリエンジンについて何も知りません(しかし私はdjangoを知っています)。モデルで使用しているタイプと、テンプレートで使用しているフォームタイプの間に競合があるようです。

class StringProperty(verbose_name = None、multiline = False、...)

multilineがFalseの場合、値に改行文字を含めることはできません。djangoformsライブラリはこれを使用して、データモデルのテキストフィールドとtextareaフィールドの違いを強制し、他の人も同様の目的で使用できます。

重要なトレースバックからの実際のエラーラインは次のとおりです。

BadValueError: Property content is not multi-line

「コンテンツ」とは、モデルのプロパティを指します。

私にとって、それはあなたが次のオプションの1つをする必要があることを示しています...

1)テキストエリアフォームフィールドから配信される複数行の値を受け入れるようにモデルを変更します。

class Greeting(db.Model):
...
  content = db.StringProperty(multiline=True)
  content2 = db.StringProperty(multiline=True)
...

2)または、textareaフォームフィールドをテンプレートのテキストフィールドに変更します。

    <div><input type="text" name="content"></div>
    <div><input type="text" name="content2"></div>
于 2012-12-06T22:16:14.253 に答える
0

これは、テンプレートをロードするために機能するコードです(情報提供のみ)。Django/Pythonコーディングのこの時点に到達してくれてありがとう。あなたなしではできなかったでしょう!

import cgi
import datetime
import urllib
import webapp2
import os

from google.appengine.ext import db
from google.appengine.api import users
from google.appengine.ext.webapp import template

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


def guestbook_key(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):
    guestbook_name=self.request.get('guestbook_name')
    greetings_query = Greeting.all().ancestor(
        guestbook_key(guestbook_name)).order('-date')
    greetings = greetings_query.fetch(3)

    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'

    template_values = {
        'greetings': greetings,
        'url': url,
        'url_linktext': url_linktext,
    }

    path = os.path.join(os.path.dirname(__file__), 'index.html')
    self.response.out.write(template.render(path, template_values))


class Guestbook(webapp2.RequestHandler):
  def post(self):
    guestbook_name = self.request.get('guestbook_name')
    greeting = Greeting(parent=guestbook_key(guestbook_name))

    if users.get_current_user():
      greeting.author = users.get_current_user().nickname()

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


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

およびindex.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">
  <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>


</body>

于 2012-12-07T21:16:24.980 に答える
0

これをどのように修正したか正確にはわかりませんが、このコードはエラーがなくなったように機能します。テンプレートがまだ機能しないため、%s エラーに関する情報としてこれを投稿しています。

ダン

import cgi
import datetime
import urllib
import webapp2
import os

from google.appengine.ext import db
from google.appengine.api import users
from google.appengine.ext.webapp import template

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


def guestbook_key(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):
    self.response.out.write('<html><body>')
    guestbook_name=self.request.get('guestbook_name')

    greetings = db.GqlQuery("SELECT * "
                        "FROM Greeting "
                        "WHERE ANCESTOR IS :1 "
                        "ORDER BY date DESC LIMIT 10",
                        guestbook_key(guestbook_name))

    for greeting in greetings:
      if greeting.author:
        self.response.out.write(greeting.author)

      else:
        self.response.out.write('An anonymous person wrote:')
    self.response.out.write(template.render('myhtml.html', {'guestbook_name': guestbook_name}))



class Guestbook(webapp2.RequestHandler):
  def post(self):
    guestbook_name = self.request.get('guestbook_name')
    greeting = Greeting(parent=guestbook_key(guestbook_name))

    if users.get_current_user():
      greeting.author = users.get_current_user().nickname()

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


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

myhtml.html コード:

<!DOCTYPE html>
  <html>
    <body>
      <form action="/sign?%s" method="post">
        <div><textarea name="content" rows="3" cols="60"></textarea></div>
        <div><input type="submit" value="Sign Guestbook"></div>
      </form>
          <script>
          document.write("<h1>This is heading</h1>");

          </script>

    </body>
  </html>
于 2012-12-07T19:54:05.997 に答える