如何从页面获取route_url以

时间:2015-09-28 16:28:57

标签: python forms uri pyramid traceback

使用Pyramid构建Web框架我有点新鲜,到目前为止一直做得很好。然而,我目前正在努力解决看似简单的任务。我有一个表单,允许用户输入信息和评级(通过POST),以便此信息可以填充我使用SQLALCHEMY构建的数据库。

表单由4个db表组成(例如用户信息,类别和元素评级以及反馈文本框)。我使用view_configHTML 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>

2 个答案:

答案 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.paramsapi.create_user(...)以及(3)api.create_assessment_result(...)中提取所有必要信息returns与其他HTTP redirectroute

基于我实施的内容的精彩文章是this(讨论

  

view callable处理的请求对象将具有   存储在名为params的对象中的表单的参数。获得   表单值与使用其请求的其他语言一样多   object返回表单值:/assessments和   firstname = request.params['firstname']

this(涵盖表单中的隐藏代码 - 如上所示)。