Django 添加记录

添加记录

到目前为止,我们已经在数据库中创建了一个 Members 表,并通过在 Python shell 中编写代码插入了 5 条记录。

我们还制作了一个模板,让我们可以在网页中显示表格的内容。

现在,我们希望能够从网页创建新成员。


模板

首先在 members 模板中添加链接:

members/templates/index.html:

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

结果将如下:


新模板

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

members/templates/add.html:

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

该模板包含一个空 HTML 表单,带有两个输入框和一个提交按钮。

注意:Django需要以下形式:

{% csrf_token %} 处理方法为 POST 的表单中的跨站点请求伪造。


View

接下来,在 members/views.py 文件中添加一个视图,将新视图命名为 add:

members/views.py:

  1. from django.http import HttpResponse
  2. from django.template import loader
  3. from .models import Members
  4. def index(request):
  5. mymembers = Members.objects.all().values()
  6. template = loader.get_template('index.html')
  7. context = {
  8. 'mymembers': mymembers,
  9. }
  10. return HttpResponse(template.render(context, request))
  11. def add(request):
  12. template = loader.get_template('add.html')
  13. return HttpResponse(template.render({}, request))

URLs

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

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. ]

在浏览器中,单击 "Add member" 链接,结果如下所示:


更多 URLs

您注意到 HTML 表单中的 action 属性了吗?action 属性指定将表单数据发送到哪里,在这种情况下,表单数据将被发送到 addrecord/,因此我们必须在 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. ]

添加记录的代码

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

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

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'))

views.py 文件中所做的更改:

第 1 行: 导入 HttpResponseRedirect

第 3 行: 导入 revers

addrecord 视图执行以下操作:

  • 通过 request.POST 语句获取请求的名字和姓氏。
  • 在 members 表中添加新记录。
  • 将用户重定向回索引视图。

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

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