.. Defining Views
================
ビューを定義する
================
.. A :term:`view callable` in a :app:`Pyramid` application is typically a simple
.. Python function that accepts a single parameter named :term:`request`. A
.. view callable is assumed to return a :term:`response` object.
:app:`Pyramid` アプリケーションにおける :term:`view callable` は、
典型的には :term:`request` という名前の 1 つのパラメータを受け取るシンプル
な Python 関数です。ビュー callable は :term:`response` オブジェクトを返す
ことが想定されます。
.. The request object passed to every view that is called as the result of a
.. route match has an attribute named ``matchdict`` that contains the elements
.. placed into the URL by the ``pattern`` of a ``route`` statement. For
.. instance, if a call to :meth:`pyramid.config.Configurator.add_route` in
.. ``__init__.py`` had the pattern ``{one}/{two}``, and the URL at
.. ``http://example.com/foo/bar`` was invoked, matching this pattern, the
.. ``matchdict`` dictionary attached to the request passed to the view would
.. have a ``'one'`` key with the value ``'foo'`` and a ``'two'`` key with the
.. value ``'bar'``.
ルートマッチの結果として呼び出される全てのビューに渡される request オブ
ジェクトは、 ``route`` 文の ``パターン`` によって URL に placed into された
要素が格納されている ``matchdict`` という名前の属性を持っています。
例えば、 ``__init__.py`` の中で行っている
:meth:`pyramid.config.Configurator.add_route` の呼び出しに
``{one}/{two}`` というパターンがあり、 ``http://example.com/foo/bar``
という URL が呼び出された場合、このパターンにマッチして、 ``'foo'`` という
値が ``'one'`` というキーに、 ``'bar'`` という値が ``'two'`` というキーに
割り当てられた ``matchdict`` という辞書が request に付け加えられてビューに
渡されます。
.. The source code for this tutorial stage can be browsed at
.. `http://github.com/Pylons/pyramid/tree/1.3-branch/docs/tutorials/wiki2/src/views/
.. `_.
このチュートリアルステージのソースコードを以下の場所で閲覧することができます。
`http://github.com/Pylons/pyramid/tree/1.3-branch/docs/tutorials/wiki2/src/views/
`_.
.. Declaring Dependencies in Our ``setup.py`` File
``setup.py`` ファイルに依存関係を宣言する
===============================================
.. The view code in our application will depend on a package which is not a
.. dependency of the original "tutorial" application. The original "tutorial"
.. application was generated by the ``pcreate`` command; it doesn't know
.. about our custom application requirements.
私たちのアプリケーションのビューのコードはオリジナルの "tutorial"
アプリケーションの依存関係にはないパッケージに依存しています。オリジナルの
"tutorial" アプリケーションは ``pcreate`` によって生成され、私たちの
カスタムアプリケーションに必要なものを知りません。
.. We need to add a dependency on the ``docutils`` package to our ``tutorial``
.. package's ``setup.py`` file by assigning this dependency to the ``requires`` parameter in ``setup()``.
``tutorial`` パッケージの ``setup.py`` ファイルでこの依存関係を
``setup`` 関数内の ``requires`` パラメータに割り当てることによって
``docutils`` パッケージへの依存を追加する必要があります。
.. Open ``tutorial/setup.py`` and edit it to look like the following:
``tutorial/setup.py`` ファイルを開き、以下のように編集してください:
.. literalinclude:: src/views/setup.py
:linenos:
:language: python
:emphasize-lines: 17
.. (Only the highlighted line needs to be added.)
(ハイライトされた行は変更が必要な箇所です)
.. Running ``setup.py develop``
``setup.py develop`` を実行する
===============================
.. Since a new software dependency was added, you will need to rerun ``python
.. setup.py develop`` inside the root of the ``tutorial`` package to obtain and
.. register the newly added dependency distribution.
新しいソフトウェア依存関係が追加されたので、新たに追加された依存パッケージ
を登録および取得するために ``tutorial`` パッケージのルート内で
``python setup.py develop`` を再実行する必要があります。
.. Make sure your current working directory is the root of the project (the
.. directory in which setup.py lives) and execute the following command.
現在のワーキングディレクトリがプロジェクトのルート (seetup.py のある
ディレクトリ) であることを確認して、次のコマンドを実行してください:
.. On UNIX:
UNIX の場合:
.. code-block:: text
$ cd tutorial
$ ../bin/python setup.py develop
.. On Windows:
Windows の場合:
.. code-block:: text
c:\pyramidtut> cd tutorial
c:\pyramidtut\tutorial> ..\Scripts\python setup.py develop
.. Success executing this command will end with a line to the console something
.. like:
このコマンドの実行に成功すると、コンソールに次のような出力が行われるでしょう:
::
Finished processing dependencies for tutorial==0.0
.. Changing the ``views.py`` File
``views.py`` ファイルを変更する
===============================
.. It's time for a major change. Open ``tutorial/tutorial/views.py`` and edit it to look like the following:
大幅な変更をするときが来ました。
``tutorial/tutorial/views.py`` ファイルを開き、以下のように編集してください:
.. literalinclude:: src/views/tutorial/views.py
:linenos:
:language: python
:emphasize-lines: 1-7,12,15-70
.. (The highlighted lines are the ones that need to be added or edited.)
(ハイライトされた行は変更が必要な箇所です)
.. We got rid of the ``my_view`` view function and its decorator that was
.. added when we originally rendered the ``alchemy`` scaffold. It was only an
.. example and isn't relevant to our application.
``alchemy`` scaffold を使ってプロジェクトを生成した時に加えられた
``my_view`` ビュー関数とそのデコレータを取り除きました。それは単なる
例で、このアプリケーションには適切ではありません。
.. Then we added four :term:`view callable` functions to our ``views.py``
.. module:
そして、 ``views.py`` モジュールに4つの :term:`view callable` 関数を
追加しました:
.. * ``view_wiki()`` - Displays the wiki itself. It will answer on the root URL.
.. * ``view_page()`` - Displays an individual page.
.. * ``add_page()`` - Allows the user to add a page.
.. * ``edit_page()`` - Allows the user to edit a page.
* ``view_wiki()`` - wiki 自体を表示します。それはルート URL の上で答えます。
* ``view_page()`` - 個々のページを表示します。
* ``add_page()`` - ページの追加を可能にします。
* ``edit_page()`` - ページの編集を可能にします。
.. We'll describe each one briefly and show the resulting ``views.py`` file
.. afterward.
各々について簡潔に記述し、結果の ``views.py`` ファイルを後で示します。
.. .. note::
.. There is nothing special about the filename ``views.py``. A project may
.. have many view callables throughout its codebase in arbitrarily-named
.. files. Files implementing view callables often have ``view`` in their
.. filenames (or may live in a Python subpackage of your application package
.. named ``views``), but this is only by convention.
.. note::
``views.py`` というファイル名に特別な意味はありません。プロジェクト
はそのコードベース全体で任意の名前のファイル中に多くのビューを持つこ
とができます。ビューを実装するファイルは多くの場合 ``view`` というファ
イル名を持っています (もしくは ``views`` という名前の アプリケーショ
ンパッケージの中の Python サブパッケージに存在しています) が、これは
単なる慣例です。
.. The ``view_wiki`` view function
ビュー関数 ``view_wiki``
-------------------------------
.. ``view_wiki()`` is the :term:`default view` that gets called when a request
.. is made to the root URL of our wiki. It always redirects to
.. a URL which represents the path to our "FrontPage".
``view_wiki()`` は wiki のルート URL に対してリクエストが行われたときに
呼び出される :term:`default view` です。それは常に "FrontPage" へのパス
を表す URL にリダイレクトします。
.. literalinclude:: src/views/tutorial/views.py
:lines: 18-21
:linenos:
:language: python
.. ``view_wiki()`` returns an instance of the
.. :class:`pyramid.httpexceptions.HTTPFound` class (instances of which implement
.. the :class:`pyramid.interfaces.IResponse` interface like
.. :class:`pyramid.response.Response` does).
``view_wiki()`` は :class:`pyramid.httpexceptions.HTTPFound` クラスの
インスタンスを返します (それは :class:`pyramid.response.Response`
のように :class:`pyramid.interfaces.IResponse` インターフェースを実装した
インスタンスです) 。
.. It uses the :meth:`pyramid.request.Request.route_url` API to construct a
.. URL to the ``FrontPage`` page (e.g. ``http://localhost:6543/FrontPage``), which
.. is used as the "location" of the ``HTTPFound`` response, forming an HTTP redirect.
それは ``FrontPage`` ページの URL (例えば
``http://localhost:6543/FrontPage``) を構築するために
:meth:`pyramid.request.Request.route_url` APIを使用します。そして、
それを ``HTTPFound`` レスポンスの "location" として使用し、 HTTP リダイレクト
を生成します。
.. The ``view_page`` view function
ビュー関数 ``view_page``
-------------------------------
.. ``view_page()`` is used to display a single page of our
.. wiki. It renders the :term:`ReStructuredText` body of a page (stored as
.. the ``data`` attribute of a ``Page`` model object) as HTML. Then it substitutes an
.. HTML anchor for each *WikiWord* reference in the rendered HTML using a
.. compiled regular expression.
``view_page()`` は wiki の単一のページを表示するために使用されます。
それは (``Page`` モデルオブジェクトの ``data`` 属性として保存された)
:term:`ReStructuredText` で書かれたページの内容を HTML としてレンダリング
します。その後、コンパイル済み正規表現を使用して、レンダリング済み HTML
中の各 *WikiWord* 参照を HTML アンカーに置換します。
.. literalinclude:: src/views/tutorial/views.py
:lines: 23-43
:linenos:
:language: python
.. The ``check()`` function is used as the first argument to
.. ``wikiwords.sub``, indicating that it should be called to provide a value for
.. each WikiWord match found in the content. If the wiki already contains a
.. page with the matched WikiWord name, ``check()`` generates a view
.. link to be used as the substitution value and returns it. If the wiki does
.. not already contain a page with the matched WikiWord name, ``check()``
.. generates an "add" link as the substitution value and returns it.
``check()`` 関数は ``wikiwords.sub`` の最初の引数として使用されます。
それはコンテンツ内で見つかった各 WikiWord のマッチに対して値を提供するために
呼び出す必要があると指示しています。もし、マッチした WikiWord 名を持つ
ページが wiki にすでに含まれている場合、 ``check()`` は置換する値として
view リンクを生成してそれを返します。もし、マッチした WikiWord 名を持つ
ページがまだ wiki に含まれていない場合、関数は置換する値として "add"
リンクを生成してそれを返します。
.. As a result, the ``content`` variable is now a fully formed bit of HTML
.. containing various view and add links for WikiWords based on the content of
.. our current page object.
この結果、 ``content`` 変数は現在のページオブジェクトの内容に基づいて
WikiWord への様々な view または add リンクを含む完全な HTML 形式に
なっています。
.. We then generate an edit URL (because it's easier to do here than in the
.. template), and we return a dictionary with a number of arguments. The fact
.. that ``view_page()`` returns a dictionary (as opposed to a :term:`response`
.. object) is a cue to :app:`Pyramid` that it should try to use a :term:`renderer`
.. associated with the view configuration to render a template. In our case,
.. the template which will be rendered will be the ``templates/view.pt``
.. template, as indicated in the ``@view_config`` decorator that is applied to
.. ``view_page()``.
その後、 edit URL を生成し (テンプレートの中よりもここで行うほうが簡単だ
からです)、いくつかの引数を含む辞書を返します。このビューが
(:term:`response` オブジェクトではなく) 辞書を返すという事実は、
テンプレートをレンダリングするためにビュー設定で関連付けられた
:term:`renderer` を使用する必要があることを :app:`Pyramid` に知らせます。
この場合、レンダリングされるテンプレートは ``view_page()`` に適用された
``@view_config`` デコレータが示すように ``templates/view.pt`` テンプレート
になります。
.. The ``add_page`` view function
ビュー関数 ``add_page``
------------------------------
.. ``add_page()`` is invoked when a user clicks on a *WikiWord* which
.. isn't yet represented as a page in the system. The ``check`` function
.. within the ``view_page`` view generates URLs to this view.
.. ``add_page()`` also acts as a handler for the form that is generated
.. when we want to add a page object. The ``matchdict`` attribute of the
.. request passed to the ``add_page()`` view will have the values we need
.. to construct URLs and find model objects.
``add_page()`` は、まだシステム内のページとして表されていない
*WikiWord* をユーザがクリックしたときに呼び出されます。 ``view_page``
ビュー内の ``check`` 関数がこのビューへの URL を生成します。
``add_page`` はまた、ページオブジェクトを追加するときに生成される
フォームのハンドラとして機能します。 ``add_page()`` ビューに渡される
リクエストの ``matchdict`` 属性は、 URL の構築とモデルオブジェクトの
検索に必要な値を含んでいます。
.. literalinclude:: src/views/tutorial/views.py
:lines: 45-56
:linenos:
:language: python
.. The ``matchdict`` will have a ``'pagename'`` key that matches the name of
.. the page we'd like to add. If our add view is invoked via,
.. e.g. ``http://localhost:6543/add_page/SomeName``, the value for
.. ``'pagename'`` in the ``matchdict`` will be ``'SomeName'``.
``matchdict`` は追加したいページの名前に一致する ``'pagename'`` キーを
持つことになります。もし、 add ビューが例えば
``http://localhost:6543/add_page/SomeName`` 経由で呼び出された場合、
``matchdict`` の中の ``'pagename'`` の値は ``'SomeName'`` になります。
.. If the view execution *is* a result of a form submission (i.e. the expression
.. ``'form.submitted' in request.params`` is ``True``), we scrape the page body
.. from the form data, create a Page object with this page body and the name
.. taken from ``matchdict['pagename']``, and save it into the database using
.. ``DBSession.add``. We then redirect back to the ``view_page`` view for the
.. newly created page.
ビューの実行がフォーム送信の結果で *ある* 場合 (つまり評価式
``'form.submitted' in request.params`` が ``True`` の場合)、
フォームデータからページの本体を取り出し、このページの本体と
``matchdict['pagename']`` から取り出した名前から Page オブジェクトを
生成し、 ``DBSession.add`` を使ってそれをデータベースに保存します。
その後、新しく作成したページの ``view_page`` ビューにリダイレクトします。
.. If the view execution is *not* a result of a form submission (i.e. the
.. expression ``'form.submitted' in request.params`` is ``False``), the view
.. callable renders a template. To do so, it generates a "save url" which the
.. template uses as the form post URL during rendering. We're lazy here, so
.. we're going to use the same template (``templates/edit.pt``) for the add
.. view as well as the page edit view. To do so we create a dummy Page object
.. in order to satisfy the edit form's desire to have *some* page object
.. exposed as ``page``. :app:`Pyramid` will render the template associated
.. with this view to a response.
ビューの実行がフォーム送信の結果では *ない* 場合 (つまり評価式
``'form.submitted' in request.params`` が ``False`` の場合) 、ビュー
callable はテンプレートをレンダリングします。そのために、テンプレート
のレンダリング時にフォームのポスト URL として使用される "save url" を
生成します。ここでは手を抜いて、同じテンプレート (``templates/edit.pt``)
を追加ビューだけでなく、ページ編集ビューに使用することにします。
``page`` として公開される *なんらかの* ページオブジェクトを持っていると
いう編集フォームの要求を満たすために、ダミー Page オブジェクトを生成します。
そして、 :app:`Pyramid` はレスポンスとしてこのビューに関連付けられている
テンプレートをレンダリングします。
.. The ``edit_page`` view function
ビュー関数 ``edit_page``
-------------------------------
.. ``edit_page()`` is invoked when a user clicks the "Edit this
.. Page" button on the view form. It renders an edit form but it also acts as
.. the handler for the form it renders. The ``matchdict`` attribute of the
.. request passed to the ``edit_page`` view will have a ``'pagename'`` key
.. matching the name of the page the user wants to edit.
``edit_page()`` は、ユーザーが view フォームの "Edit this Page" ボタン
をクリックしたときに呼び出されます。 ``edit_page`` は編集フォームを
レンダリングしますが、レンダリングしたフォームのハンドラとしても機能します。
``edit_page`` ビューに渡されるリクエストの ``matchdict`` 属性は、ユーザー
が編集するページの名前に一致する ``'pagename'`` キーを持つことになります。
.. literalinclude:: src/views/tutorial/views.py
:lines: 58-70
:linenos:
:language: python
.. If the view execution *is* a result of a form submission (i.e. the expression
.. ``'form.submitted' in request.params`` is ``True``), the view grabs the
.. ``body`` element of the request parameters and sets it as the ``data``
.. attribute of the page object. It then redirects to the ``view_page`` view
.. of the wiki page.
ビューの実行がフォーム送信の結果で *ある* 場合 (つまり評価式
``'form.submitted' in request.params`` が ``True`` の場合)、
リクエストパラメータの ``body`` 要素を取得し、 page オブジェクトの
``data`` 属性としてセットします。次に wiki ページの ``view_page``
ビューにリダイレクトします。
.. If the view execution is *not* a result of a form submission (i.e. the
.. expression ``'form.submitted' in request.params`` is ``False``), the view
.. simply renders the edit form, passing the page object and a ``save_url``
.. which will be used as the action of the generated form.
ビューの実行がフォーム送信の結果では *ない* 場合 (つまり評価式
``'form.submitted' in request.params`` が ``False`` の場合)、
page オブジェクトと、生成されたフォームのアクションとして使用するための
``save_url`` を渡して単に編集フォームをレンダリングします。
.. Adding Templates
テンプレートの追加
==================
.. The ``view_page``, ``add_page`` and ``edit_page`` views that we've added
.. reference a :term:`template`. Each template is a :term:`Chameleon` :term:`ZPT`
.. template. These templates will live in the ``templates`` directory of our
.. tutorial package. Chameleon templates must have a ``.pt`` extension to be
.. recognized as such.
追加した ``view_page``, ``add_page``, ``edit_page`` ビューは
:term:`template` を参照しています。各テンプレートは :term:`Chameleon`
:term:`ZPT` テンプレートです。これらのテンプレートは tutorial パッケージの
``templates`` ディレクトリの中にあります。 Chameleon テンプレートとして
認識されるためには ``.pt`` 拡張子を持たなければなりません。
.. The ``view.pt`` Template
``view.pt`` テンプレート
------------------------
.. Create ``tutorial/tutorial/templates/view.pt`` and add the following
.. content:
``tutorial/tutorial/templates/view.pt`` を作成して次の内容を追加してください:
.. literalinclude:: src/views/tutorial/templates/view.pt
:linenos:
:language: xml
.. This template is used by ``view_page()`` for displaying a single
.. wiki page. It includes:
このテンプレートは、単一の wiki ページを表示するために ``view_page()``
によって使用されます。以下の内容が含まれています:
.. - A ``div`` element that is replaced with the ``content``
.. value provided by the view (rows 45-47). ``content``
.. contains HTML, so the ``structure`` keyword is used
.. to prevent escaping it (i.e. changing ">" to ">", etc.)
.. - A link that points
.. at the "edit" URL which invokes the ``edit_page`` view for
.. the page being viewed (rows 49-51).
- ビューによって提供される ``content`` 値で置き換えられる ``div`` 要素
(45-47行目)。 ``content`` には HTML が含まれます。そのためエスケープ
(つまり ">" を ">" にするような変更) を防ぐために ``structure``
キーワードが使われています。
- 表示されているページに対して ``edit_page`` ビューを呼び出す "edit"
URL を指すリンク (49-51行目)。
.. The ``edit.pt`` Template
``edit.pt`` テンプレート
------------------------
.. Create ``tutorial/tutorial/templates/edit.pt`` and add the following
.. content:
``tutorial/tutorial/templates/edit.pt`` を作成して次の内容を追加してください:
.. literalinclude:: src/views/tutorial/templates/edit.pt
:linenos:
:language: xml
.. This template is used by ``add_page()`` and ``edit_page()`` for adding
.. and editing a wiki page. It displays
.. a page containing a form that includes:
このテンプレートは wiki ページの追加と編集のために ``add_page()`` と
``edit_page()`` によって使用されます。これは以下のようなフォームを含む
ページを表示します。
.. - A 10 row by 60 column ``textarea`` field named ``body`` that is filled
.. with any existing page data when it is rendered (rows 46-47).
.. - A submit button that has the name ``form.submitted`` (row 48).
- レンダリングされた時に既存のページのデータで埋められる、
10列60行の "body" という名前の ``textarea`` フィールド (46-47行目)。
- "form.submitted" という名前の送信ボタン (48行目)。
.. The form POSTs back to the "save_url" argument supplied
.. by the view (row 45). The view will use the ``body`` and
.. ``form.submitted`` values.
このフォームは、ビューによって提供される "save_url" 引数に POST 送信されます
(45行目)。ビューは ``body`` と ``form.submitted`` の値を使います。
.. .. note:: Our templates use a ``request`` object that
.. none of our tutorial views return in their dictionary.
.. ``request`` is one of several
.. names that are available "by default" in a template when a template
.. renderer is used. See :ref:`chameleon_template_renderers` for
.. information about other names that are available by default
.. when a Chameleon template is used as a renderer.
.. note::
これらのテンプレートでは、いずれのビューでもその辞書の中で返していない
``request`` オブジェクトを利用しています。 ``request`` はテンプレート内で
"デフォルトで" 利用可能ないくつかの名前のうちの1つです。レンダラーとして
Chameleon テンプレートを使用しているときにテンプレート内でデフォルトで
利用可能な他の名前についての情報は
:ref:`chameleon_template_renderers` を参照してください。
.. Static Assets
静的アセット
--------------
.. Our templates name a single static asset named ``pylons.css``. We don't need
.. to create this file within our package's ``static`` directory because it was
.. provided at the time we created the project. This file is a little too long
.. to replicate within the body of this guide, however it is available `online
.. `_.
これらのテンプレートは ``pylons.css`` という名前の静的アセットを
参照しています。このファイルはプロジェクトを作成した時点で提供されているので、
パッケージの ``static`` ディレクトリ内にこのファイルを作成する必要は
ありません。このファイルはこのガイドの本体内で置き換えるには少し長すぎますが、
`オンライン
`_. で
利用可能です。
.. This CSS file will be accessed via
.. e.g. ``http://localhost:6543/static/pylons.css`` by virtue of the call to
.. ``add_static_view`` directive we've made in the ``__init__.py`` file. Any
.. number and type of static assets can be placed in this directory (or
.. subdirectories) and are just referred to by URL or by using the convenience
.. method ``static_url``
.. e.g. ``request.static_url('{{package}}:static/foo.css')`` within templates.
この CSS ファイルは ``__init__.py`` ファイルの中で行なった
``add_static_view`` の宣言の呼び出しのために、例えば
``http://localhost:6543/static/pylons.css`` を介してアクセスされます。
任意の数と種類の静的アセットはこのディレクトリ (またはサブディレクトリ)
に配置することができ、 URL によって参照するか、便利なメソッド
``static_url`` を使用して参照します。例えばテンプレート内で
``request.static_url('{{package}}:static/foo.css')`` のように使用します。
.. Adding Routes to ``__init__.py``
``__init__.py`` にルートを追加する
==================================
.. The ``__init__.py`` file contains
.. :meth:`pyramid.config.Configurator.add_route` calls which serve to add routes
.. to our application. First, we’ll get rid of the existing route created by
.. the template using the name ``'home'``. It’s only an example and isn’t
.. relevant to our application.
``__init__.py`` ファイルにはアプリケーションにルートを追加するための
:meth:`pyramid.config.Configurator.add_route` の呼び出しが含まれています。
最初に、テンプレート (訳注: scaffold) によって作成された ``'home'`` という
名前を使用している既存のルートを取り除きます。これは単なる例で、この
アプリケーションには関係ありません。
.. We then need to add four calls to ``add_route``. Note that the *ordering* of
.. these declarations is very important. ``route`` declarations are matched in
.. the order they're found in the ``__init__.py`` file.
その後、 ``add_route`` を4回呼び出す必要があります。なお、これらの宣言
の *順番* は非常に重要です。 ``ルート`` 宣言はそれらが ``__init__.py``
ファイルの中で見つかった順番でマッチされます。
.. #. Add a declaration which maps the pattern ``/`` (signifying the root URL)
.. to the route named ``view_wiki``. It maps to our ``view_wiki`` view
.. callable by virtue of the ``@view_config`` attached to the ``view_wiki``
.. view function indicating ``route_name='view_wiki'``.
1. ``/`` というパターン (ルート URL の意味) から ``view_wiki`` という名前の
ルートにマッピングする宣言を追加します。それは ``view_wiki`` ビュー
関数に付けられた ``route_name='view_wiki'`` を示す ``@view_config`` に
よって、ビュー callable ``view_wiki`` にマッピングします。
.. #. Add a declaration which maps the pattern ``/{pagename}`` to the route named
.. ``view_page``. This is the regular view for a page. It maps
.. to our ``view_page`` view callable by virtue of the ``@view_config``
.. attached to the ``view_page`` view function indicating
.. ``route_name='view_page'``.
2. ``/{pagename}`` というパターンを ``view_page`` という名前のルートに
マッピングする宣言を追加します。これはページに対する通常のビューです。
それは ``view_page`` ビュー関数に付けられた
``route_name='view_page'`` を示す ``@view_config`` によって、ビュー
callable ``view_page`` にマッピングします。
.. #. Add a declaration which maps the pattern ``/add_page/{pagename}`` to the
.. route named ``add_page``. This is the add view for a new page. It maps
.. to our ``add_page`` view callable by virtue of the ``@view_config``
.. attached to the ``add_page`` view function indicating
.. ``route_name='add_page'``.
3. ``/add_page/{pagename}`` というパターンを ``add_page`` という名前の
ルートにマッピングする宣言を追加します。これは新しいページを追加する
ためのビューです。それは ``add_page`` ビュー関数に付けられた
``route_name='add_page'`` を示す ``@view_config`` によって、ビュー
callable ``add_page`` にマッピングします。
.. #. Add a declaration which maps the pattern ``/{pagename}/edit_page`` to the
.. route named ``edit_page``. This is the edit view for a page. It maps
.. to our ``edit_page`` view callable by virtue of the ``@view_config``
.. attached to the ``edit_page`` view function indicating
.. ``route_name='edit_page'``.
4. ``/{pagename}/edit_page`` というパターンを ``edit_page`` という名前の
ルートにマッピングする宣言を追加します。これはページの編集ビューです。
それは ``edit_page`` ビュー関数に付けられた
``route_name='edit_page'`` を示す ``@view_config`` によって、ビュー
callable ``edit_page`` にマッピングします。
.. As a result of our edits, the ``__init__.py`` file should look
.. something like:
編集の結果として ``__init__.py`` ファイルはこのようになるはずです:
.. literalinclude:: src/views/tutorial/__init__.py
:linenos:
:language: python
:emphasize-lines: 18-21
.. (The highlighted lines are the ones that need to be added or edited.)
(ハイライトされた行は変更が必要な箇所です)
.. Viewing the Application in a Browser
ブラウザでアプリケーションを表示する
====================================
.. We can finally examine our application in a browser (See
.. :ref:`wiki2-start-the-application`). Launch a browser and visit
.. each of the following URLs, check that the result is as expected:
ようやくブラウザでアプリケーションを実行することができます
(:ref:`wiki2-start-the-application` 参照) 。ブラウザを起動して次の
各 URL を開き、結果が予想通りであることをチェックしてください:
.. - ``http://localhost:6543`` in a browser invokes the
.. ``view_wiki`` view. This always redirects to the ``view_page`` view
.. of the FrontPage page object.
- ``http://localhost:6543`` にブラウザでアクセスすると ``view_wiki``
ビューが呼び出されます。このビューは常に FrontPage page オブジェクトの
``view_page`` ビューにリダイレクトします。
.. - ``http://localhost:6543/FrontPage`` in a browser invokes
.. the ``view_page`` view of the front page object.
- ``http://localhost:6543/FrontPage`` にブラウザでアクセスすると、
フロントページオブジェクトの ``view_page`` ビューが呼び出されます。
.. - ``http://localhost:6543/FrontPage/edit_page`` in a browser
.. invokes the edit view for the front page object.
- ``http://localhost:6543/FrontPage/edit_page`` にブラウザでアクセス
すると、フロントページ page オブジェクトの edit ビューが呼び出されます。
.. - ``http://localhost:6543/add_page/SomePageName`` in a
.. browser invokes the add view for a page.
- ``http://localhost:6543/add_page/SomePageName`` にブラウザでアクセス
すると、ページの add ビューが呼び出されます。
.. - To generate an error, visit ``http://localhost:6543/foobars/edit_page`` which
.. will generate a ``NoResultFound: No row was found for one()`` error.
.. You'll see an interactive traceback facility provided
.. by :term:`pyramid_debugtoolbar`.
- エラーを発生させるために ``http://localhost:6543/foobars/edit_page`` に
アクセスしてください。それは ``NoResultFound: No row was found for one()``
エラーを発生させます。 :term:`pyramid_debugtoolbar` によって提供された
インタラクティブトレースバック機能が見られるでしょう。