如何在Django模板中访问表单字段?

0 投票
3 回答
2165 浏览
提问于 2025-04-16 16:41

我正在使用基于模型的表单来创建一个表单,这个表单是根据数据模型生成的。插入部分运行得很好,但我现在正在尝试做“编辑”页面。我的问题是,我需要原始模型的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))

撰写回答