django框架使用
一、app注册:
pycharm使用django框架,注意在注册界面时就创建app,如果没有创建app。就在终端中运行
python manage.py startapp [app名]
然后再在settings.py里注册。
格式为:
[app名].apps.[首字母大写的app名]Config
二、创建数据表:
1.现在mysql中创建数据库,再在settings.py里连接数据库
settings.py关键代码:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'ceshi',
'USER': 'root',
'PASSWORD': '999123457',
'HOST': 'localhost',
'POST': '3306',
}
}
顺带一提:调试阶段确保DEBUG设置为True
2.在models.py里创建类(即数据表)
例:
from django.db import models
class user(models.Model):
name=models.CharField(verbose_name='姓名',max_length=20)
time=models.DateTimeField(verbose_name='时间',auto_now_add=True) # 自动添加时间
相当于创建了两列,一个为name一个为time。
然后执行
python manage.py makemigrations
python manage.py migrate
详见https://blog.csdn.net/qq_75247548/article/details/145709159?spm=1001.2014.3001.5501
三、创建url和view的对应关系
1.在urls.py中创建url对应关系,打开url就会执行对应的视图函数
from django.contrib import admin
from django.urls import path
from app.views import *
urlpatterns = [
path('admin/', admin.site.urls),
path('', index, name='index'),
path('xg/', xg, name='xg')
]
2.
def index(request):
user_list = models.user.objects.all()
return render(request, '2.html', {'form1': user_list})
获取models.py里的user类(即数据表)的所有数据并加载到2.html中
2.html则可以引用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>111111</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-s1swLUYcLBqAXHj7nWZcBD03oDfaVT4TaOQEaQGnSa65SsyckDHTlfGcB8+LOLkz" crossorigin="anonymous"></script>
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.min.js"></script>
<table class="table table-striped table-dark">
<thead>
<tr>
<th scope="col">id</th>
<th scope="col">name</th>
<th scope="col">time</th>
</tr>
</thead>
<tbody>
{% for i in form1 %}
<tr>
<th scope="row">{{ i.id }}</th>
<td>{{ i.name }}</td>
<td>{{ i.time }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<a href="{% url 'xg' %}"><button type="button" class="btn btn-outline-primary">修改</button></a>
</body>
</html>
3.html又反向解析到xg的url中,找到views.py里对应的视图函数执行,然后又可以返回一个页面,以此类推。
过程:
tips:提交表单记得
{% csrf_token %}
四、form.Modelform组件
1.定义
class Usermodel(forms.ModelForm):
class Meta:
model = models.user # models.py里的类名
fields = ['name'] # 在html会自动生成合适的组件
widgets = {
"name": forms.TextInput(attrs={
"class": "form-control",
"placeholder": "输入姓名"
}),
}
error_messages = {
'name': {
'required': 'Please enter your name.',
},
}
usermodel为定义的类名,继承forms.ModelForm这个django内置库。Meta,fields,widgets等为固定格式,不可修改。
首先指定model=【models.py里定义的数据表名】,
fields指定表单对象name,
fields指定后可以用widgets指定自定义样式为文字输入【TextInput】并添加自定义样式,
error_messages指定如果输入的数据不合规的报错信息
2.使用
当我们定义好之后,如果输入的内容想直接保存在数据库中非常简单。只需要
form = Usermodel(data=request.POST)
if form.is_valid():
form.save()
return render(request, '成功.html')
else:
return render(request, '1.html', {'form2': form})
其中form.is_valid()用于验证表单是否符合数据库规定的格式,如果符合就保存并返回成功。
否则直接返回
五、案例
用上面的知识,我们可以自己搭建一个简单的打卡系统。
因为同一个表单我们需要两种提交按钮,一种用于添加,一种用于删除。并且我们后台需要判断点击的是哪种按钮来执行不同的后台视图函数。因此我们使用JavaScript对我们的按钮进行监听,以执行不同的函数。并且执行完操作我们需要更新数据库并返回页面,就需要用到反向解析。
功能:
演示视频
附源码:
https://github.com/dubaibubai/dubaibubai.git(未更新)
问题整理:
1.html的button跳转传参:
用a标签嵌套,直接跳转到这个kjxg的url,但是这里先会获取当前页面url的page参数的值,并以url合规的形式附加到href中,接着进入视图函数,可以从url直接获取page值(获取值不一定从表单获取,也可以直接在url中传参),再重定向到index url中
<a href="{% url 'kjxg' i.id %}?page={{ request.GET.page|default:1 }}" class="btn btn-outline-danger btn-sm">删除</a>
def kjxg(request, id):
# 获取当前页码
current_page = request.GET.get('page', 1) # 如果没有页码参数,默认为 1
# 执行删除操作
models.user.objects.filter(id=id).delete()
# 重定向到当前页码
return redirect(f'{reverse("index")}?page={current_page}')