Django 更新记录

更新记录

要更新记录,我们需要记录的 ID,我们需要一个带有界面的模板,让我们更改值。

首先我们需要对 index.html 模板进行一些修改。


修改模板

首先为表中的每个成员添加一个链接:

members/templates/index.html:

  1. <h1>Members</h1>
  2. <table border="1">
  3. {% for x in mymembers %}
  4. <tr>
  5. <td><a href="update/{{ x.id }}">{{ x.id }}</a></td>
  6. <td>{{ x.firstname }}</td>
  7. <td>{{ x.lastname }}</td>
  8. <td><a href="delete/{{ x.id }}">delete</a>
  9. </tr>
  10. {% endfor %}
  11. </table>
  12. <p>
  13. <a href="add/">Add member</a>
  14. </p>

该链接指向一个名为 update 的视图,该视图具有当前 member 的 ID。

结果如下:


视图

接下来, 在 members/views.py 文件中添加 update 视图:

members/views.py:

  1. from django.http import HttpResponse, HttpResponseRedirect
  2. from django.template import loader
  3. from django.urls import reverse
  4. from .models import Members
  5. def index(request):
  6. mymembers = Members.objects.all().values()
  7. template = loader.get_template('index.html')
  8. context = {
  9. 'mymembers': mymembers
  10. }
  11. return HttpResponse(template.render(context, request))
  12. def add(request):
  13. template = loader.get_template('add.html')
  14. return HttpResponse(template.render({}, request))
  15. def addrecord(request):
  16. first = request.POST['first']
  17. last = request.POST['last']
  18. member = Members(firstname=first, lastname=last)
  19. member.save()
  20. return HttpResponseRedirect(reverse('index'))
  21. def delete(request, id):
  22. member = Members.objects.get(id=id)
  23. member.delete()
  24. return HttpResponseRedirect(reverse('index'))
  25. def update(request, id):
  26. mymember = Members.objects.get(id=id)
  27. template = loader.get_template('update.html')
  28. context = {
  29. 'mymember': mymember,
  30. }
  31. return HttpResponse(template.render(context, request))

update 视图执行以下操作:

  • 获取 id 作为参数。
  • 使用 id 在 Members 表中找到正确的记录。
  • 加载一个名为 update.html 的模板。
  • 创建包含成员的对象。
  • 将对象发送到模板。
  • 输出模板渲染的 HTML。

新模板

templates 文件夹中添加一个名为 update.html 的新模板:

members/templates/update.html:

  1. <h1>Update member</h1>
  2. <form action="updaterecord/{{ mymember.id }}" method="post">
  3. {% csrf_token %}
  4. First Name:<br>
  5. <input name="first" value="{{ mymember.firstname }}">
  6. <br><br>
  7. Last Name:<br>
  8. <input name="last" value="{{ mymember.lastname }}">
  9. <br><br>
  10. <input type="submit" value="Submit">
  11. </form>

该模板包含一个 HTML 表单,其中包含来自所选 member 的值。

注意: Django 需要表单中的这一行:

{% csrf_token %}

在方法为 POST 的表单中处理跨站点请求伪造。

URLs

members/urls.py 文件中添加一个 path() 函数,将 url 127.0.0.1:8000/members/update/ 指向正确的位置,ID 作为参数:

members/urls.py:

  1. from django.urls import path
  2. from . import views
  3. urlpatterns = [
  4. path('', views.index, name='index'),
  5. path('add/', views.add, name='add'),
  6. path('add/addrecord/', views.addrecord, name='addrecord'),
  7. path('delete/<int:id>', views.delete, name='delete'),
  8. path('update/<int:id>', views.update, name='update'),
  9. ]

在浏览器中,单击要更改的成员的 ID,结果如下所示:


提交时会发生什么?

您注意到 HTML 表单中的 action 属性了吗?action 属性指定表单数据的发送位置,在本例中,表单数据将发送到:updaterecord/{{ mymember.id }},因此我们必须在 members/urls.py 文件中添加指向右视图的 path() 函数:

members/urls.py:

  1. from django.urls import path
  2. from . import views
  3. urlpatterns = [
  4. path('', views.index, name='index'),
  5. path('add/', views.add, name='add'),
  6. path('add/addrecord/', views.addrecord, name='addrecord'),
  7. path('delete/<int:id>', views.delete, name='delete'),
  8. path('update/<int:id>', views.update, name='update'),
  9. path('update/updaterecord/<int:id>', views.updaterecord, name='updaterecord'),
  10. ]

更新记录的代码

到目前为止,我们已经创建了用户界面,并将 URL 指向名为 updaterecord 的视图,但我们还没有创建视图。

确保在 members/views.py 文件中的中添加 updaterecord 视图:

members/views.py:

  1. from django.http import HttpResponse, HttpResponseRedirect
  2. from django.template import loader
  3. from django.urls import reverse
  4. from .models import Members
  5. def index(request):
  6. mymembers = Members.objects.all().values()
  7. template = loader.get_template('index.html')
  8. context = {
  9. 'mymembers': mymembers,
  10. }
  11. return HttpResponse(template.render(context, request))
  12. def add(request):
  13. template = loader.get_template('add.html')
  14. return HttpResponse(template.render({}, request))
  15. def addrecord(request):
  16. x = request.POST['first']
  17. y = request.POST['last']
  18. member = Members(firstname=x, lastname=y)
  19. member.save()
  20. return HttpResponseRedirect(reverse('index'))
  21. def delete(request, id):
  22. member = Members.objects.get(id=id)
  23. member.delete()
  24. return HttpResponseRedirect(reverse('index'))
  25. def update(request, id):
  26. mymember = Members.objects.get(id=id)
  27. template = loader.get_template('update.html')
  28. context = {
  29. 'mymember': mymember,
  30. }
  31. return HttpResponse(template.render(context, request))
  32. def updaterecord(request, id):
  33. first = request.POST['first']
  34. last = request.POST['last']
  35. member = Members.objects.get(id=id)
  36. member.firstname = first
  37. member.lastname = last
  38. member.save()
  39. return HttpResponseRedirect(reverse('index'))

updaterecord 函数将用所选 ID 更新 members 表中的记录。

尝试更新一个记录,看看它是如何工作的:

如果按 "提交" 按钮,则 "成员" 表应已更新: