简单金字塔应用程序:使用查询参数进行路由编辑页面

时间:2015-01-20 03:46:11

标签: pyramid

我正在尝试创建一个简单的金字塔应用程序,并且有一段时间弄清楚我缺少哪种语法部分。发生的事情是我的模型有一个编辑页面,我无法弄清楚如何传入我正在编辑的条目的ID。

我的观点如下:

@view_config(route_name='action', match_param='action=edit', renderer='string')
def update(request):
    this_id = request.matchdict.get('id', -1)
    entry = Entry.by_id(this_id)
if not entry:
    return HTTPNotFound()
form = EntryUpdateForm(request.POST, entry)
if request.method == 'POST' and form.validate():
    form.populate_obj(entry)
    return HTTPFound(location=request.route_url('blog', id=entry.id, slug=entry.slug))
return {'form': form, 'action': request.matchdict.get('action')}

我创建了一个编辑模板,它看起来像这样,并且正在使用创建页面,它使用不同的模型:

{% extends "templates/layout.jinja2" %}
{% block body %}
<h2>Create a Journal Entry</h2>
<form action="" method="POST">
{% for field in form %}
  {% if field.errors %}
    <ul>
    {% for error in field.errors %}
        <li>{{ error }}</li>
    {% endfor %}
    </ul>
  {% endif %}
    <p>{{ field.label }}: {{ field }}</p>
{% endfor %}
    <p><input type="submit" name="submit" value="Submit" /></p>
</form>
{% endblock %}

我对模板的链接如下:

<a href="{{request.route_url('action', action='edit',_query=(('id',entry.id),))}}">Edit Entry</a>

产生网址http://0.0.0.0:6543/journal/edit?id=1。这对我来说是新的和奇怪的,因为我已经习惯了Rails,其中url看起来像http://0.0.0.0:6543/journal/1/edit但是在阅读Pyramid博客教程时,这似乎是Pyramid喜欢有路线的方式。不幸的是,它仍然给了我404.似乎我成功地将条目的id传递给查询字符串,但不知怎的,我没有告诉编辑页面在那个位置。

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:1)

如果您将浏览器导航到localhost:8080 / journal / edit?id = 723

,我无法看到问题出在哪里,因为这个最小的示例有效
#!/usr/bin/env python
from pyramid.response import Response
from pyramid.view import view_config
from pyramid.config import Configurator
from waitress import serve

@view_config(route_name="root", renderer="string")
def root_view(request):
    return "root_view", request.params

@view_config(route_name='action', match_param='action=edit', renderer="string")
def action_view(request):
    return "action_view", request.params

if __name__ == '__main__':
    config = Configurator()
    config.add_route('root', '')
    config.add_route('action', '/journal/{action}')
    config.scan()
    app = config.make_wsgi_app()
    serve(app)

也许你的路线有其他问题。你能把它们粘贴在这里吗?您确定在视图中没有另一个名为update的函数吗?

除此之外,您可以完全自由地使用金字塔构建路线。

config.add_route('action2', '/different/edit/{id}')
config.add_route('action3', '/someother/{id}/edit')

我个人宁愿使用上面的方案之一而不是match_param谓词......