如何在Django模板中访问表单字段?
我正在使用基于模型的表单来创建一个表单,这个表单是根据数据模型生成的。插入部分运行得很好,但我现在正在尝试做“编辑”页面。我的问题是,我需要原始模型的ID(主键)来进行提交操作,而之前的讨论告诉我可以试试form.id和form.instance.id这两个,但都没有效果。有没有什么想法或者帮助呢?
这是我的模板:
<form action="/athlete/edit/{{ form.mod_athlete.id }}" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
这是我视图的一部分:
def changeathlete(request, athlete_id):
if request.method == 'POST': # If the form has been submitted...
form = AthleteForm(request.POST) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
form.save()
return HttpResponse("Athlete changed!") # Redirect after POST
else:
mod_athlete = Athlete.objects.get(pk=athlete_id)
form = AthleteForm(instance=mod_athlete) # An unbound form
return render_to_response('edit.html', {
'form': form,
}, context_instance=RequestContext(request))
任何帮助都非常感谢,如果你需要更多信息,我很乐意提供。我当然是Django和真正编程的新手,所以我只是根据教程和这个来学习。谢谢!
更新
urls.py中相关的部分:
url(r'^$', 'rosters.views.index', name='index'),
url(r'^admin/', include(admin.site.urls)),
url(r'^athlete/add/', 'rosters.views.createathlete'),
url(r'^athlete/edit/(?P<athlete_id>\d+)/', 'rosters.views.changeathlete'),
url(r'^meet/(?P<meet_slug>\w+)/', 'rosters.views.meetindex'),
url(r'^meet/(?P<meet_slug>\w+)/(?P<occurence_name>\w+)/', 'rosters.views.occurenceindex'),
url(r'^meet/(?P<meet_slug>\w+)/(?P<occurence_name>\w+)/events/', 'rosters.views.meetevents'),
url(r'^meet/(?P<meet_slug>\w+)/(?P<occurence_name>\w+)/events/(?P<event_id>\w+)/', 'rosters.views.addathletes'),
3 个回答
0
我对比了一下我用来编辑表单的代码,你的视图看起来没问题。正如geekam问的,你的urls.py文件是什么样的?应该像下面这样:
(r'^athlete/edit/(?P<athlete_id>\d+)/$', changeathlete),
补充一下:我在url捕获中用的正则表达式是基于数字ID的,我不知道你的ID是什么样的。
3
这个Athlete
实例会被保存在ModelForm
里面,所以你可以这样做:
{{ form.instance.id }}
另外,如果你想更新这个Athlete
实例,而不是新建一个,你需要在POST
请求中传递这个实例。
2
如果你在编辑过程中一直停留在同一页面上(比如说 http://localhost:8000/athlete/edit/1234/
),那么在你的表单中不需要在动作属性里写任何东西,下面的代码就可以正常工作:
<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>
你的表单在处理POST请求的时候,也应该传入实例对象:
def changeathlete(request, athlete_id):
mod_athlete = Athlete.objects.get(pk=athlete_id)
if request.method == 'POST': # If the form has been submitted...
form = AthleteForm(request.POST, instance=mod_athlete) # A form bound to the POST data
if form.is_valid(): # All validation rules pass
form.save()
return HttpResponse("Athlete changed!") # Redirect after POST
else:
form = AthleteForm(instance=mod_athlete) # An unbound form
return render_to_response('edit.html', {
'form': form,
}, context_instance=RequestContext(request))