Python 如何从页面获取路由url以在表单中实现

Python 如何从页面获取路由url以在表单中实现,python,forms,uri,pyramid,traceback,Python,Forms,Uri,Pyramid,Traceback,我对使用Pyramid构建web框架有点陌生,到目前为止,我一直做得很好。然而,我目前正在努力完成一项看似简单的任务。我有一个表单,允许用户输入信息和评级(通过POST),以便这些信息可以填充我使用SQLALCHEMY构建的数据库 该表格由4个db表格组成(例如用户信息、类别和元素评级以及反馈文本框)。我已经为这个HTML表单构建了一个view\u config,它使用了request.params['something\u to\u check']和CRUDAPI(这是对RESTful设计的补

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

该表格由4个
db
表格组成(例如用户信息、类别和元素评级以及反馈文本框)。我已经为这个
HTML
表单构建了一个
view\u config
,它使用了
request.params['something\u to\u check']
CRUD
API
(这是对
RESTful
设计的补充)

问题是: 1.我试图从表单所在的评估页面中获取id,并将其与表单关联(可能是一个隐藏字段,以便我可以使用
request.params
并使用我的API(如下所示)

我在一个类似实例的堆栈上读了一篇文章,但是这个函数是一个包含所有表单细节的单一函数,而不是一个为匹配id而设计的函数。Pyramid上有一些好的文档,但我不确定它们是否是我在这个实例中寻找的。我将如何在我的代码/表单中实现类似的东西?另外,我是不使用flask——我使用的是JINJA2模板

表格的路线(路线实体、评估,未列出):

视图.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模板


#假设要找到评估页面id
用户名
{{forms.input('username')}
名字
{{forms.input('firstname')}
姓氏
{{forms.input('lastname')}
电子邮件
{{forms.input('email')}
#用于添加分级的模式代码。。。

如果我读对了,我会这样做:

添加路线:

    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请求包装到它们自己的事务中


希望这会有所帮助!

从用户将要处理的页面中提取id的工作方法(通过表单)如下所示:

  • 客户访问某个表单:
    http://.../assessment/23.
  • 服务器匹配路由并向
    /assessment/{id}
    视图
    代码发送控制
  • View
    code使用
    id=int(request.matchdict['id'])
    加载
    assessment\u object=api.检索\u assessment(id)
    并填充 返回一个
    dict
    ,如下所示:
例如:

def assessment_form_view(request): 
   #some code
   return {'assessment_id': id, 'video_url': assessment_object.video_url, ...}
Jinja通过
评估表单视图
上的
@view\u config(…,renderer='some\u template')
使用模板数据呈现表单

表格应显示:

<form ... action="/save_assessment_result" method="POST">
    <input type="hidden" name="assessment_id" value="{{ assessment_id }}" />
    ...
</form>

...
客户提交此信息。
服务器将
路由
/save\u assessment\u result
请求方法class='POST'
匹配,并将控制权传递给相关的查看功能
def save\u assessment\u result\u view(请求):

这个
查看函数
(1)从
请求中提取所有必要的信息。参数
,(2)调用
api。创建用户(…)
api。创建评估结果(…)
,(3)
返回
一个
HTTP重定向
到其他一些
路由
/assessment

在我已经实现的基础上构建的优秀文章是(讨论

视图可调用处理的请求对象将具有 存储在名为params的对象中的窗体参数 表单值与使用其请求的其他语言中的值非常相似 对象返回表单值:
firstname=request.params['firstname']
lastname=request.params['lastname']


和(包括在表单中找到的隐藏代码,如上所示)。

您能澄清一下吗?您需要什么?句子很长,我试图解析它,但失败了:(问题:1.我需要从用户输入信息/评分的评估页面id页面请求路由uri,以便我可以轻松地将其插入API,将用户结果和评估页面合并到一个实体中;这称为评估结果,使用用户和评估,例如API.create\u assessment\u results(所有者,评估)。@Mikkoohtama我对它进行了一些清理以澄清。谢谢Mikko。关于使用事务管理器的提示将被调查。这有助于澄清一些事情!
def assessment_form_view(request): 
   #some code
   return {'assessment_id': id, 'video_url': assessment_object.video_url, ...}
<form ... action="/save_assessment_result" method="POST">
    <input type="hidden" name="assessment_id" value="{{ assessment_id }}" />
    ...
</form>