0

私は、サイトのどこからでも呼び出すことができる「サインアップ」ページを持つ Web サイトに取り組んでいます。

「ユーザー」製品の次のダミー インターフェイスと実装があります。

インターフェース:

 ##
 ## located in bahmanm/sampleapp/interfaces.py
 ##
 class ISampleAppUser(Interface):
        """
        """

実装:

 ##
 ## located in bahmanm/sampleapp/implementation/SampleAppUser.py
 ##
 class SampleAppUser:
      """
      """

      implements(ISampleAppUser)

 # Note that this method is outside of the implementation class.
 #
 def manage_addSampleAppUser(self, id, title):
    # ...

indexさしあたって、次のテンプレート (サインアップ テンプレート) につながるリンクがページにあると仮定しましょう。

 <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns="http://xml.zope.org/namespaces/tal">
   <head><title>Add a new User</title></head>
   <body>
    <h2>Add a user instance</h2>
    <form action="#" method="POST"
          tal:attributes="action python:'manage_addSampleAppUser'">
       <p>Id: <input type="text" name="id"/></p>
       <p>Title: <input type="text" name="title"/></p>
       <input type="submit" value="Add"/>
    </form>
   </body>
  </html>

ただし、のactionプロパティの正しい値を見つけることができませんでしたform; 私が得るのは「リソースが見つかりません」だけです。

正直なところ、Zope のメカニズムを理解するのは私の側の問題だと思います。configure.zcmlソリューション、実装、またはテンプレート自体をどこで掘り下げる必要があるかについてのヒント/手がかりをいただければ幸いです。ティア、

4

1 に答える 1

1

そのためのビューを作成する必要があります。そのような Product ファクトリを URL から呼び出すこともできますが、お勧めしません。

ビューを使用すると、フォームとコードを組み合わせて新しいユーザーを 1 か所で作成できます。

from zope.publisher.browser import BrowserPage
from sampleapp.implementation.SampleAppUser import manage_addSampleAppUser


class NewUserSignup(BrowserPage):
    def __call__(self):
        # called when the view is being rendered
        if 'submit' in self.request:
            # form was submitted, handle
            self.addUser()
        return self.index()  # render the template

    def addUser(self):
        # extract form fields from self.request.form
        # validation, error handling, etc.
        if someerror:
            self.error = 'Error message!'
            return

        user = manage_addSampleAppUser(self.context, id, title)
        # add things to this new user if needed

        # all done, redirect to the default view on the new user object
        self.request.response.redirect(user.absolute_url())

次に、このビューを次のように登録します。

<browser:page
    for="*"
    name="signup"
    class=".signup.NewUserSignup"
    template="signup.pt"
    permission="zope.public"
    />

新しいページが登録されると、namedがクラスの属性templateとして追加されるため、メソッドはそれを呼び出し ( )、結果を返すことができます。indexNewUserSignup__call__self.index()

サインアップ処理とテンプレートを組み合わせたので、エラー処理を簡単に組み込むことができます。誰かが初めてページをロードしたときself.request.formは空になりますが、誰かが送信ボタンを押すとすぐに、これを検出してaddUserメソッドを呼び出すことができます。

そのメソッドは、ユーザーを作成してからこのページからリダイレクトするか、エラー メッセージを設定して戻り、その時点でフォームが再レンダリングされます。

これにより、action設定が簡単になります。空のままにすることも、現在のコンテキスト URL とビューの名前を設定することもできます。一緒に、テンプレートは次のようになります。

<html xmlns="http://www.w3.org/1999/xhtml"
        xmlns="http://xml.zope.org/namespaces/tal">
   <head><title>Add a new User</title></head>
   <body>
    <h2>Add a user instance</h2>
    <div class="errormessage" tal:condition="view/error|nothing" tal:content="view/error">
        Conditional error message appears here
    </div>

    <form action="#" method="POST"
          tal:attributes="action string:${context/absolute_url}/@@${view/__name__}">
       <p>Id: <input type="text" name="id"
                      tal:attributes="value request/form/id|nothing" /></p>
       <p>Title: <input type="text" name="title"
                      tal:attributes="value request/form/title|nothing" /></p>
       <input type="submit" value="Add" name="submit"/>
    </form>
   </body>
</html>

フォームの入力にもリクエストからの既存のデータが事前に入力されていることに注意してください。これにより、訪問者はエラーを修正しやすくなります。

于 2013-01-13T12:56:35.200 に答える