Tuesday, 15 March 2011

django pass bound form field value to url as keyword argument results None -



django pass bound form field value to url as keyword argument results None -

i have form edit existing set of models. post form, attempting direct action url keyword argument value of 'id' field in bound form. receive next error:

noreversematch @ /membership/edit/12 reverse 'members_edit' arguments '()' , keyword arguments '{u'id': none}' not found. 1 pattern(s) tried: ['membership/edit/(?p<id>\\d{1,5})$']

this relevant html form:

<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> &nbsp{{edit_member_form.member_id.value}}</p> </div> </div> </form>

i know value not none in form because when display bound form before post submitted, line containing {{edit_member_form.member_id.value}} evaluates integer (eg, 12) , displays correctly.

i new django, why edit_member_form.member_id.value evaluate none in url tag, evaluates number bound form when displaying?

if there improve technique same desired effect, i'd more happy hear it. want post form same url has been displayed from, keyword intact.

thanks in advance help or advice.

edit:

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 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'] homecoming redirect('members_view', id=member_id) else: context['edit_member_form'] = edit_member_form #return render(request, 'members/members_edit.html', context) # else display initial form else: member_set = member.objects.filter(pk=id) # if find fellow member if ( len(member_set) == 1): fellow member = member_set[0] member_dict = { k:v k,v in member.__dict__.items() if k not in ['_state', 'photo']} member_dict['member_id'] = id # passes season, haven't been flagged lost/stolen pass_set = member.pass_set.filter(season=get_current_season(), lost_stolen=false) # if fellow member has 1 current season pass associated 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) # create sure don't have many crazy reason elif ( len(pass_set) > 1 ): context['pass_error'] = true context['pass_error_msg'] = 'error: fellow member has many active passes season.\nplease have director edit record directly.' #return render(request, 'members/members_edit.html', context) # else fellow member hasn't been enrolled yet season # want 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 crazy reason there multiple members id elif ( len(member_set) >1): context['member_error'] = true context['member_error_msg'] = 'error: multiple members id ' + str(id) +'\nplease have director edit these records directly' #return render(request, 'members/members_edit.html', context) # else fellow member doesn't exist else: context['member_error'] = true context['member_error_msg'] = "error: fellow member doesn't exist.\nplease sign them new" #return render(request, 'members/members_edit.html', context) homecoming render(request, 'members/members_edit.html', context)

edit 2: issue appears value of edit_member_form.member_id not staying bound form field when submitting. i'm not sure why happen though.

if display the field itself, form submits successfully. ie,

<p><strong>id #:</strong> &nbsp{{edit_member_form.member_id}}</p>

works

<p><strong>id #:</strong> &nbsp{{edit_member_form.member_id.value}}</p>

doesn't.

how can display field value, without beingness editable, value remains bound form?

edit 3: here relevant code 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

also, in own attempts solve problem, believe can solved if can write markup displays value posts value on submit. think issue

<p><strong>id #:</strong> &nbsp{{edit_member_form.member_id}}</p>

evaluates <input> field in markup, gets posted when form submitted. since displaying value not evaluate including input tag, values not posted request. question becomes how post info request on form submit without <input> field? should perhaps intervene bit more hacky, jquery?

solution finally, solution add together hidden input in field containing value submit. amounted 1 line after displaying field

<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}}">

i believe may simple removing "action" attribute form. if this, form post itself; i.e., form on /membership/edit/12/ post /membership/edit/12/.

this eliminate need print id in form on page.

django django-forms django-templates django-views

No comments:

Post a Comment