我正在尝试创建一个简单的金字塔应用程序,并且有一段时间弄清楚我缺少哪种语法部分。发生的事情是我的模型有一个编辑页面,我无法弄清楚如何传入我正在编辑的条目的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传递给查询字符串,但不知怎的,我没有告诉编辑页面在那个位置。
感谢您提供任何帮助。
答案 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谓词......