使用Pyramid
构建Web框架我有点新鲜,到目前为止一直做得很好。然而,我目前正在努力解决看似简单的任务。我有一个表单,允许用户输入信息和评级(通过POST
),以便此信息可以填充我使用SQLALCHEMY
构建的数据库。
表单由4个db
表组成(例如用户信息,类别和元素评级以及反馈文本框)。我使用view_config
和HTML
request.params['something_to_check']
(这与CRUD
设计相称)的组合为此API
表单构建了RESTful
。
问题:
1.我试图从表单中存在的评估页面中获取id并将其与表单相关联(可能作为隐藏字段,以便我可以使用request.params
并使用我的API(如下所示)。
我在类似实例的堆栈上阅读post,但是这个函数是一个单一函数,它接收所有表单细节,而不是为匹配id而设计的函数。金字塔在grabbing resources上有一些很好的文档,但我不确定它们是否是我在这个例子中寻找的东西。我如何在我的代码/表单中实现类似的东西?此外,我不使用烧瓶 - 我正在使用JINJA2模板。
表格的路线(路线实体,评估,未列出):
config.add_route('save_assessment_result', '/save_assessment_result')
config.add_route('create_assessment_form', '/create_assessment_form')
views.py
@view_config(route_name='save_assessment_result', renderer='templates/assessment_form.jinja2')
def form(request):
with transaction.manager:
username = request.params['username']
firstname = request.params['firstname']
lastname = request.params['lastname']
email = request.params['email']
owner = api.create_user(username, firstname, lastname, email)
assessment_id = int(request.params['id'])
assessment_obj = api.retrieve_assessment(assessment_id)
assessment_results = api.create_assessment_results(owner, assessment_obj)
category_rating_int = int(request.params['category_rating_int'])
category = request.params['category_name']
category_rating = api.create_category_rating(category_rating_int, category, assessment_results)
element_rating_int = int(request.params['element_rating_int'])
element = request.params['element_text']
element_rating = api.create_element_rating(element_rating_int, element, assessment_results)
text = request.params['text']
comment = api.create_comment(text, element, assessment_results)
transaction.commit()
return {}
形成JINJA模板
<form method='POST' action='/save_assessment_result' autocomplete="on">
<div class="form-group">
<input type="hidden" name="assessment_id" value='{{assessment_id}}'/> #suppose to find assessment page id
<dl class='user_form'>
<dt><label for = 'username'> Username </label></dt>
<dd>{{ forms.input('username') }}</dd>
<dt><label for = 'firstname'> Firstname </label></dt>
<dd>{{ forms.input('firstname') }}</dd>
<dt><label for = 'lastname'> Lastname </label></dt>
<dd>{{ forms.input('lastname') }}</dd>
<dt><label for = 'email'> Email </label></dt>
<dd>{{ forms.input('email') }}</dd>
<dd><input type="submit" name="submit" value="Submit" /></dd>
# MODE CODE for adding ratings...
</dl>
答案 0 :(得分:1)
如果我读得正确,我会这样做:
添加路线:
config.add_route('success', '/success/{assessment_id}')
然后是观点:
@view_config(route_name='success', renderer='templates/assessment_form.jinja2')
def form(request, assessment_id):
with transaction.manager:
...
重新发布评估_id是一个隐藏的字段。
获取路线:
url = request.route_url("success", assessment_id=assessment.id)
注意:您不需要使用transanction.manager
,因为您可以自动将所有HTTP请求包装到自己的事务中。
希望这有帮助!
答案 1 :(得分:0)
从用户将要处理的页面(通过表单)中拉出id的工作方法如下:
http://.../assessment/23.
view
的{{1}}代码。 /assessment/{id}
代码使用View
加载
id = int(request.matchdict['id'])
并填充和
返回assessment_object = api.retrieve_assessment(id)
,如下所示:示例:
dict
Jinja在def assessment_form_view(request):
#some code
return {'assessment_id': id, 'video_url': assessment_object.video_url, ...}
上通过@view_config(..., renderer='some_template')
使用template_data呈现表单。
表格应显示:
assessment_form_view
客户提交此信息。
服务器将<form ... action="/save_assessment_result" method="POST">
<input type="hidden" name="assessment_id" value="{{ assessment_id }}" />
...
</form>
route
与/save_assessment_result
匹配,将控制权传递给关联的视图函数request_method='POST'
此def save_assessment_result_view(request):
(1)从view function
,(2)调用request.params
和api.create_user(...)
以及(3)api.create_assessment_result(...)
中提取所有必要信息returns
与其他HTTP redirect
,route
。
基于我实施的内容的精彩文章是this(讨论
view callable处理的请求对象将具有 存储在名为params的对象中的表单的参数。获得 表单值与使用其请求的其他语言一样多 object返回表单值:
/assessments
和firstname = request.params['firstname']
和this(涵盖表单中的隐藏代码 - 如上所示)。