首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Django开发一个简易的学生管理系统

定义模型

from?django.db?import?models

class?Student(models.Model):

gender_choices?=?(

("男",?"男"),

("女",?"女"),

("保密",?"保密"),

)

name?=?models.CharField(db_index=True,?max_length=36,?verbose_name="姓名")

age?=?models.SmallIntegerField(verbose_name="年龄")

gender?=?models.CharField(verbose_name="性别",?choices=gender_choices,?max_length=6)

birthday?=?models.DateField(verbose_name="生日")

def?__str__(self):

return?self.name

class?Meta:

db_table?=?'student'

verbose_name?=?"学生"

verbose_name_plural?=?verbose_name

迁移数据:

python?manage.py?makemigrations

python?manage.py?migrate

后台管理

python?manage.py?createsuperuser

将模型注册到后台:

启动服务,访问后台,然后添加几个学生,至少添加三个。

渲染学生列表

定义视图函数:

定义路由:

from?django.urls?import?path

from?.?import?views

app_name?=?'index'

urlpatterns?=?[

path("student/list/",?views.student_list,?name="student_list"),

]

定义模板:

<meta?charset="UTF-8">

<title>Title</title>

<tr>

<th>#</th>

<th>姓名</th>

<th>年龄</th>

<th>性别</th>

<th>生日</th>

</tr>

{%?for?student?in?students?%}

<tr>

<td>{{?forloop.counter?}}</td>

<td>{{?student.name?}}</td>

<td>{{?student.age?}}</td>

<td>{{?student.gender?}}</td>

<td>{{?student.birthday?}}</td>

</tr>

{%?empty?%}

<tr>

<td?colspan="5">暂无数据</td>

</tr>

{%?endfor?%}

此时,启动服务,访问:http://localhost:8001/student/list/

添加学生

这次数据是从前端到后端的,所以我们先写模板:

<meta?charset="UTF-8">

<title>Title</title>

{%?csrf_token?%}

<div>

<label?for="name">姓名</label>

<input?type="text"?id="name"?name="name">

</div>

<div>

<label?for="age">年龄</label>

<input?type="number"?id="age"?name="age">

</div>

<div>

<label?for="birthday">生日</label>

<input?type="date"?id="birthday"?name="birthday">

</div>

<div>

<label?for="gender">性别</label>

<select?id="gender"?name="gender">

<option?value="">请选择</option>

<option?value="男">男</option>

<option?value="女">女</option>

<option?value="保密">保密</option>

</select>

</div>

<div>

<button?type="submit">提交</button>

</div>

接着,我们再定义路由:

from?django.urls?import?path

from?.?import?views

app_name?=?'index'

urlpatterns?=?[

path("student/list/",?views.student_list,?name="student_list"),

path("student/add/",?views.student_add,?name="student_add"),

]

最后,我们再添加视图:

import?datetime

from?django.shortcuts?import?render,?redirect

from?.?import?models

def?student_list(request):

context?=?{}

students?=?models.Student.objects.all()

context['students']?=?students

return?render(request,?"student/list.html",?context)

def?student_add(request):

context?=?{}

if?request.method?==?"POST":

#?获取参数

name?=?request.POST.get("name")

age?=?request.POST.get("age")

gender?=?request.POST.get("gender")

birthday?=?request.POST.get("birthday")

print(name,?age,?gender,?birthday)

#?执行添加

student?=?models.Student(name=name,?age=age,?gender=gender,?birthday=birthday)

student.save()

return?redirect("index:student_list")

return?render(request,?"student/add.html",?context)

修改学生信息

首先,我们需要修改一下学生列表对应的模板,在表格的后面新增一个操作列。需要注意的是,在编辑的href属性里面,我们将学生ID作为查询参数传递给了后端。

<meta?charset="UTF-8">

<title>Title</title>

<tr>

<th>#</th>

<th>姓名</th>

<th>年龄</th>

<th>性别</th>

<th>生日</th>

<th>操作</th>

</tr>

{%?for?student?in?students?%}

<tr>

<td>{{?forloop.counter?}}</td>

<td>{{?student.name?}}</td>

<td>{{?student.age?}}</td>

<td>{{?student.gender?}}</td>

<td>{{?student.birthday?}}</td>

<td>

<a?href="{%?url?'index:student_edit'?%}?id={{?student.id?}}">编辑</a>

</td>

</tr>

{%?empty?%}

<tr>

<td?colspan="6">暂无数据</td>

</tr>

{%?endfor?%}

接着,我们定义路由:

from?django.urls?import?path

from?.?import?views

app_name?=?'index'

urlpatterns?=?[

path("student/list/",?views.student_list,?name="student_list"),

path("student/add/",?views.student_add,?name="student_add"),

path("student/edit/",?views.student_edit,?name="student_edit"),

]

然后我们再添加视图函数。视图函数稍微复杂了一点,包含GET和POST两种处理逻辑。我们先根据学生ID查询学生信息,如果是GET请求,就将学生信息传递给前端,然前端渲染要修改的学生信息。如果是POST请求,我们就获取用户要修改的学生信息,进行替换,然后保存到数据库。最后重定向到学生列表页面。

需要注意的是,我们同时又传递了id和genders两个属于,便于渲染。

def?student_edit(request):

context?=?{}

#?查询学生信息

uid?=?request.GET.get("id")

context["id"]?=?uid

context["genders"]?=?["男",?"女",?"保密"]

student?=?models.Student.objects.filter(pk=uid).first()

print(uid,?student)

if?request.method?==?"POST":

#?获取参数

name?=?request.POST.get("name")

age?=?request.POST.get("age")

gender?=?request.POST.get("gender")

birthday?=?request.POST.get("birthday")

print(name,?age,?gender,?birthday)

#?执行修改

if?name:

student.name?=?name

if?age:

student.age?=?age

if?gender:

student.gender?=?gender

if?birthday:

student.birthday?=?birthday

student.save()

return?redirect("index:student_list")

context["student"]?=?student

return?render(request,?"student/edit.html",?context)

然后,我们再添加修改学生的模板。这个模板也稍微有点复杂,一个是性别的渲染,利用了for循环渲染和if条件渲染两种灵活的语法,用于标识被选中的值。另一个是生日的渲染,生日默认会渲染为“2024年1月1日”这样的格式,inpute:date标签无法渲染,需要手动转换为"2024-1-1"这样的格式。

<meta?charset="UTF-8">

<title>Title</title>

{%?csrf_token?%}

<div>

<label?for="name">姓名</label>

<input?type="text"?id="name"?name="name"?value="{{?student.name?}}">

</div>

<div>

<label?for="age">年龄</label>

<input?type="number"?id="age"?name="age"?value="{{?student.age?}}">

</div>

<div>

<label?for="birthday">生日</label>

<input?type="date"?id="birthday"?name="birthday"?value="{{?student.birthday?|?date:"Y-m-d"}}">

</div>

<div>

<label?for="gender">性别</label>

<select?id="gender"?name="gender">

{%?for?gender?in?genders?%}

{%?if?student.gender?==?gender?%}

<option?value="{{?gender?}}"?selected>{{?gender?}}</option>

{%?else?%}

<option?value="{{?gender?}}">{{?gender?}}</option>

{%?endif?%}

{%?endfor?%}

</select>

</div>

<div>

<button?type="submit">提交</button>

</div>

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OYxUM8SCCtFwkQGHBGLVPfWA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com