【发布时间】:2014-08-12 20:29:52
【问题描述】:
我有一个表单来编辑现有的一组模型。为了发布表单,我试图将操作定向到带有关键字参数的 url,作为绑定表单中“id”字段的值。但是我收到以下错误:
NoReverseMatch at /membership/edit/12
Reverse for 'members_edit' with arguments '()' and keyword arguments '{u'id': None}' not found. 1 pattern(s) tried: ['membership/edit/(?P<id>\\d{1,5})$']
这是我的表单的相关 html:
<form class="form-horizontal" role="form" action="{% url 'members_edit' id=edit_member_form.member_id.value %}" method="post"> {% csrf_token %}
<div class="row">
<!-- Static ID number -->
<div class="col-md-4 col-md-offset-4 form-control-static text-big">
<p><strong>ID #:</strong>  {{edit_member_form.member_id.value}}</p>
</div>
</div>
</form>
我知道表单中的值不是 None,因为当我在提交 POST 之前显示绑定表单时,包含 {{edit_member_form.member_id.value}} 的行计算为整数(例如,12)并正确显示。
我是django的新手,但是为什么edit_member_form.member_id.value在url标签中计算为None,但在显示时计算为绑定到表单的数字?
如果有更好的技术来获得相同的预期效果,我会很高兴听到它。真的,我只是想将表单发布回显示它的相同网址,并且关键字完好无损。
提前感谢您的任何帮助或建议。
编辑:
def members_edit(request, id="1"):
context = { 'active':'members' }
context['filter_list'] = Member.objects.all().order_by('last_name')
id=int(id)
print 'callec'
# if form was submitted
if (request.method == 'POST'):
edit_member_form = EditMemberForm(request.POST)
if edit_member_form.is_valid(): #all validation rules pass
print 'called'
edit_member_and_pass( edit_member_form.cleaned_data )
member_id = edit_member_form.cleaned_data['member_id']
return redirect('members_view', id=member_id)
else:
context['edit_member_form'] = edit_member_form
#return render(request, 'members/members_edit.html', context)
# else display an initial form
else:
member_set = Member.objects.filter(pk=id)
# if we find the member
if ( len(member_set) == 1):
member = member_set[0]
member_dict = { k:v for k,v in member.__dict__.items() if k not in ['_state', 'photo']}
member_dict['member_id'] = id
# get only their passes for this season, that haven't been flagged lost/stolen
pass_set = member.pass_set.filter(season=get_current_season(), lost_stolen=False)
# if the member has one current season pass associated with him
if ( len(pass_set) == 1):
member_pass = pass_set[0]
member_dict['member_type'] = member_pass.member_type
member_dict['active_id'] = member_pass.active_id
edit_member_form = EditMemberForm( member_dict)
context['edit_member_form'] = edit_member_form
#return render(request, 'members/members_edit.html', context)
# make sure they don't have too many for some crazy reason
elif ( len(pass_set) > 1 ):
context['pass_error'] = True
context['pass_error_msg'] = 'Error: Member has too many active passes for this season.\nPlease have a director edit this record directly.'
#return render(request, 'members/members_edit.html', context)
# else the member hasn't been enrolled yet for this season
# so we want to reenroll them
else:
edit_member_form = EditMemberForm( member_dict )
context['edit_member_form'] = edit_member_form
#return render(request, 'members/members_edit.html', context)
# if for some crazy reason there are multiple members with this id
elif ( len(member_set) >1):
context['member_error'] = True
context['member_error_msg'] = 'Error: Multiple members with id ' + str(id) +'\nPlease have a director edit these records directly'
#return render(request, 'members/members_edit.html', context)
# else the member doesn't exist
else:
context['member_error'] = True
context['member_error_msg'] = "Error: Member doesn't exist.\nPlease sign them up as new"
#return render(request, 'members/members_edit.html', context)
return render(request, 'members/members_edit.html', context)
编辑 2: 问题似乎是edit_member_form.member_id 的值在提交时未绑定到表单字段。我不确定为什么会发生这种情况。
如果我显示字段本身,则表单提交成功。 即,
<p><strong>ID #:</strong>  {{edit_member_form.member_id}}</p>
有效但
<p><strong>ID #:</strong>  {{edit_member_form.member_id.value}}</p>
没有。
如何显示字段值,而不是可编辑,但使值保持绑定到表单?
编辑 3:
这是我urls.py的相关代码
urlpatterns = patterns('members.views',
url(r'^membership/view/(?P<id>\d{1,5})$', 'members_view', name='members_view'), # view members page
url(r'^membership/edit/(?P<id>\d{1,5})$', 'members_edit', name='members_edit'), # edit members page
另外,在我自己解决问题的尝试中,我相信如果我可以编写标记以便显示值,并且在提交时发布该值,它就可以解决。我认为问题在于
<p><strong>ID #:</strong>  {{edit_member_form.member_id}}</p>
评估为标记中的<input> 字段,该字段在提交表单时发布。由于仅显示值不会评估为包含此输入标签,因此不会将值发布到请求中。所以现在的问题变成了如何在没有<input> 字段的情况下将数据发布到表单提交的请求中?我是否应该干预一些更老套的东西,比如 jQuery?
解决方案 最后,解决方案是在包含要提交的值的字段中添加隐藏输入。在显示该字段后,它基本上只增加了这一行
<p class="form-control-static" id="id_member_id">{{edit_member_form.member_id.value}}</p>
<input type="hidden" id="id_member_id" name="member_id" value="{{edit_member_form.member_id.value}}">
【问题讨论】:
-
你能发布你的views.py吗?你试过
action="{% url 'members_edit' edit_member_form.member_id.value %}" -
我已经发布了视图。它还没有完全完成,但定义确实需要一个关键字参数
id,我认为这是与此问题相关的方面。我也尝试过,但是我只使用位置参数(None,)而不是关键字参数错误时得到相同的错误。 -
member_id 和 edit_member_form.member_id.value 不一样吗??
-
是的,它们代表相同的东西。我尝试通过添加
context['member_id'] = member_id将member_id通过上下文直接传递到html,这解决了重定向问题,但现在表单无效,因为edit_member_form.member_id和edit_member_form.active_id都是None。这里的根本问题是这些值似乎没有在提交时反弹到表单中。 -
你的
urls.py是什么?
标签: django django-forms django-templates django-views