文章内容

2018/8/3 13:32:17,作 者: 黄兵

Could not build url for endpoint 'xxx'. Did you forget to specify values ['xxx']?

最近在使用Flask的时候报如下错误:

werkzeug.routing.BuildError

werkzeug.routing.BuildError: Could not build url for endpoint 'manage.admin_edit_classification'. Did you forget to specify values ['classification_id']?


出错原因:

未查明。


解决方案:

在网上也没有找到很好的答案,经过不断摸索,终于解决问题。

视图代码:

@manage.route('/admin_edit_classification/<int:classification_id>', methods=['GET', 'POST'])
@login_required
@admin_required
def admin_edit_classification(classification_id):
# get classification item
classification_item = MaterialClassification.query.filter_by(id=classification_id).first()
# 获取当前用户id
user_id = current_user.id
# 页面信息
user_info = User.query.get_or_404(user_id)
title = '首 页'
page_name = 'Dashboard'
page_features = 'dashboard & statistics'
# get classification tables
get_classification_material = MaterialClassification.query.all()
# form
form = AddClassificationForm()
form.classification_name.data = classification_item.classification_name
form.classification_icon.data = classification_item.classification_icon
form.classification_icon.id = classification_item.id
return render_template('manage/admin_edit_classification.html', user_info=user_info, name=title,
pageName=page_name, description=page_name, pageFeatures=page_features,
classification_lists=get_classification_material, form=form,classification_item=classification_item)

这些代码也没有什么问题。

这是一个通过列表,修改内容的页面,通过传递需要修改的Id,到达修改页面。

之后看了一下前端代码:

<form action="{{ url_for('.admin_edit_classification') }}" method="post" role="form" enctype="multipart/form-data"/>
{{ form.csrf_token }}
<div class="form-group">
{{ form.classification_name.label(class='control-label',for='default') }}
{{ form.classification_name(class='form-control',placeholder='Placeholder text',id='default') }}
</div>
<div class="form-group">
{{ form.classification_icon.label(class='control-label',for='default') }}
<div class="fileinput fileinput-new" data-provides="fileinput">
<div class="input-group">
<div class="form-control uneditable-input input-fixed" data-trigger="fileinput">
<i class="fa fa-file fileinput-exists"></i>&nbsp;
<span class="fileinput-filename"> </span>
</div>
<span class="input-group-addon btn default btn-file">
<span class="fileinput-new"> Select file </span>
<span class="fileinput-exists"> Change </span>
{{ form.classification_icon() }}
</span>
<a href="javascript:;" class="input-group-addon btn red fileinput-exists"
data-dismiss="fileinput"> Remove </a>
</div>
</div>
</div>
<div class="form-group">
{{ form.submit(class='btn green') }}
</div>
</form>

似乎也没有什么问题,之后再看看报错内容:

  • File "E:\Python\Material prices\app\templates\manage\admin_edit_classification.html", line 43, in block "content"

    <form action="{{ url_for('.admin_edit_classification') }}" method="post" role="form" enctype="multipart/form-data"/>
  • File "E:\Python\Material prices\venv\lib\site-packages\flask\helpers.py", line 356, in url_for

    return appctx.app.handle_url_build_error(error, endpoint, values)
  • File "E:\Python\Material prices\venv\lib\site-packages\flask\app.py", line 2061, in handle_url_build_error

    reraise(exc_type, exc_value, tb)
  • File "E:\Python\Material prices\venv\lib\site-packages\flask\_compat.py", line 35, in reraise

    raise value
  • File "E:\Python\Material prices\venv\lib\site-packages\flask\helpers.py", line 345, in url_for

    force_external=external)
  • File "E:\Python\Material prices\venv\lib\site-packages\werkzeug\routing.py", line 1776, in build

    raise BuildError(endpoint, values, method, self)
werkzeug.routing.BuildError: Could not build url for endpoint 'manage.admin_edit_classification'. Did you forget to specify values ['classification_id']?


确定还是上面的form表单存在问题。

经过不断研究,修改代码:

<form action="{{ url_for('.admin_edit_classification',classification_id = form.classification_icon.id) }}" method="post" role="form" enctype="multipart/form-data"/>
{{ form.csrf_token }}
<div class="form-group">
{{ form.classification_name.label(class='control-label',for='default') }}
{{ form.classification_name(class='form-control',placeholder='Placeholder text',id='default') }}
</div>
<div class="form-group">
{{ form.classification_icon.label(class='control-label',for='default') }}
<div class="fileinput fileinput-new" data-provides="fileinput">
<div class="input-group">
<div class="form-control uneditable-input input-fixed" data-trigger="fileinput">
<i class="fa fa-file fileinput-exists"></i>&nbsp;
<span class="fileinput-filename"> </span>
</div>
<span class="input-group-addon btn default btn-file">
<span class="fileinput-new"> Select file </span>
<span class="fileinput-exists"> Change </span>
{{ form.classification_icon() }}
</span>
<a href="javascript:;" class="input-group-addon btn red fileinput-exists"
data-dismiss="fileinput"> Remove </a>
</div>
</div>
</div>
<div class="form-group">
{{ form.submit(class='btn green') }}
</div>
</form>

更改了form的url,后面加了参数id,最后问题终于解决。

个人感觉应该是需要修改的form表单url有问题,例如:

传过来需要修改的url:http://xxx.com/list/1

修改页面的表单url:http://xxx.com/edit/1,而不能是:http://xxx.com/edit/。


好了,问题解决。


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - Could not build url for endpoint 'xxx'. Did you forget to specify values ['xxx']?

分享到:

发表评论

评论列表