1. プロジェクトを作成する
1. プロジェクトを作成する
pycharm を使用して対応するコンパイラを選択し、対応するファイル名を入力して、[プロジェクトの作成] をクリックします。デフォルトの外層によって生成されたテンプレートと DIRS 構成アイテムを削除します。
2. アプリの作成
appo1 を作成するコマンド:
python manage.py スタートアップアプリ app01
pycharm>tool>manage.py タスクを使用する場合:
manage.py@day16 > 起動アプリ app01
APPを生成したら、設定のINSTALLED_APPに登録します。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01.apps.App01Config'
]
3. Django の方法でテーブル構造を作成する
「app01>model.py」と入力し、テーブル構造を記述します。
from django.db import models
class Department(models.Model):
"""部门表"""
id = models.BigAutoField(verbose_name='id,自增', primary_key=True) # bigint类型
# id = models.AutoField(verbose_name='id,自增',primary_key=True)#int类型
title = models.CharField(verbose_name='标题', max_length=32)
class UserInfo(models.Model):
"""员工表"""
name = models.CharField(verbose_name="姓名", max_length=16)
password = models.CharField(verbose_name="密码", max_length=64)
age = models.IntegerField(verbose_name='年龄')
account = models.DecimalField(verbose_name='账户余额', max_length=10, decimal_places=2, default=0)
creat_time = models.DateTimeField(verbose_name='入职时间')
# 无约束
depart_id = models.BigIntegerField(verbose_name='部门ID')
# 1.有约束
# - to:表示与哪张表关联
# - to_field:与这张表的哪一列关联
# 2.django:自动加
# - 写的depart,但实际数据库字段为depart_id
# 3.如果部门表被删除
# - 3.1级联删除
depart = models.ForeignKey(to='Department', to_field='id', on_delete=models.CASCADE)
# - 3.2 置空
depart = models.ForeignKey(to='Department', to_field='id', blank=True, null=True ,on_delete=models.SET_NULL)
4. データベーステーブルの生成
形式: mysql [-h ホスト名] -u ユーザー名 -p パスワード [-P ポート番号] [-D データベース名]
パラメータオプション:
[-h ホスト名または IP アドレス] または [–host=ホスト名 IP アドレス]: ログイン用のホスト名を指定します。
[-u username] または [–user=username]: ログインするユーザーのユーザー名を指定します。
[-p パスワード (p 小文字)] または [-password=password]: ログイン パスワードを入力します。
[-P ポート番号 (大文字の P)] または [-port=ポート番号]: MySQL ログインのポート番号を指定します。
[-D データベース名] または [-database=データベース名]: ログイン データベース名を指定します。
ローカル データベースにログインするには、ユーザー名 (-u) とパスワード (-p) を指定するだけでよく、ホスト名 (-h) を指定する必要はありません。
データベースを作成します day16 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
すべてのデータベースを表示します。
データベースを表示します。
settings.py のデータベース構成を変更します。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django', # 数据库名字
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1', # 要连接哪台机器上的MySQL
'PORT': '3306' # 端口号
}
}
Python manage.py makemigrations
python manage.py 移行
生成されたテーブルを表示します。
データ名を使用する;
テーブルを表示する;
説明 app01_Department;
5.部門管理
現時点では最も原始的な方法で作られた単なる体験です
Django では Form コンポーネントと ModelForm コンポーネントが提供されており、非常に便利です。
5.1 部分的なリスト
from django.db import models
class Department(models.Model):
"""部门表"""
id = models.BigAutoField(verbose_name='id,自增', primary_key=True) # bigint类型
# id = models.AutoField(verbose_name='id,自增',primary_key=True)#int类型
title = models.CharField(verbose_name='标题', max_length=32)
class UserInfo(models.Model):
"""员工表"""
name = models.CharField(verbose_name="姓名", max_length=16)
password = models.CharField(verbose_name="密码", max_length=64)
age = models.IntegerField(verbose_name='年龄')
account = models.DecimalField(verbose_name='账户余额', max_digits=10, decimal_places=2, default=0)
creat_time = models.DateTimeField(verbose_name='入职时间')
# 无约束
# depart_id = models.BigIntegerField(verbose_name='部门ID')
# 1.有约束
# - to:表示与哪张表关联
# - to_field:与这张表的哪一列关联
# 2.django:自动加
# - 写的depart,但实际数据库字段为depart_id
# 3.如果部门表被删除
# - 3.1级联删除
depart = models.ForeignKey(to='Department', to_field='id', on_delete=models.CASCADE)
# - 3.2 置空
depart = models.ForeignKey(to='Department', to_field='id', blank=True, null=True, on_delete=models.SET_NULL)
# 4.Django中做的约束:
gender_choices = (
(0, '女'),
(1, '女')
)
gender = models.SmallIntegerField(verbose_name='性别,男1,女0', choices=gender_choices)
2. テンプレートの継承
共通部分をテンプレート化し、異なる位置にスロットを挿入し、最終的に共通部分を継承し、差別化部分を書き換えることで、コードの再利用が実現されます。
再利用されたコード セクションで、スロットを追加し、ファイルにlayout.htmlという名前を付けます。
<div class="content">
{
% block css %}{
% endblock %}
{
% block content %}{
% endblock %}
</div>
共通部分を継承して、差別化部分を書き換えます。
%{
% extends 'layout.html' %}
{
% block content%}
<h1>首页</h1>
{
% endblock %}
3. ユーザー管理
7.1 新しいユーザーの作成
- オリジナルのメソッド実装のアイデア (より本質的ですが、面倒です):
- ユーザーが提出したデータは検証が面倒です
- フィールドが不正な場合は、フィールドが不正であることを示すプロンプトが表示されます。
- ページのレンダリング、各フィールドを書き換える必要がある
- 関連付けられたテーブルについては、テーブル クエリに移動して自分でレンダリングする必要があります
- Django コンポーネントの実装:
- フォーム コンポーネント (適度に単純): 最初の 3 点のみを解決でき、最後の関連付けテーブル クエリは自分で記述する必要があります。
- ModelForm の価格 (最も簡単): データベース内のテーブルには ModelForm を使用することをお勧めします
7.2 ダンジョのフォームコンポーネント
ビュー.py:
class Myform(Form): #Dajango中的Form
user = forms.CharField(widget = forms.Input)
pwd = forms.CharField(widget = forms.Input)
emaill = forms.EmailField(widget = forms.Input)
def user_add(request):
"""添加用户(原始方式)"""
if request.method == "GET":
form = Myform()
return render(request, 'user_add.html', {
'form':form})
user_add.html 内
<form class="form-horizontal" method="post">
{
{form.user}}
{
{form.pwd}}
{
{form.email}}
<!-->
自动生成HTML标签,代替下面的:
<input type="text" class="form-control" name="name" placeholder="请输入部门名称">
<!-->
</form>
もっと簡潔な方法もあります。
<form class="form-horizontal" method="post">
{% for field in form%}
{# 会循环将form中的字段转换成HTMl渲染在页面上 #}
{
{field}}
{% endfor %}
</form>
7.3 Danjo の ModelForm コンポーネント ()
1.model.py
class UserInfo(models.Model):
"""员工表"""
name = models.CharField(verbose_name="姓名", max_length=16)
password = models.CharField(verbose_name="密码", max_length=64)
age = models.IntegerField(verbose_name='年龄')
account = models.DecimalField(verbose_name='账户余额', max_digits=10, decimal_places=2, default=0)
creat_time = models.DateTimeField(verbose_name='入职时间')
depart = models.ForeignKey(to='Department', to_field='id', on_delete=models.CASCADE)
depart = models.ForeignKey(to='Department', to_field='id', blank=True, null=True, on_delete=models.SET_NULL)
gender_choices = (
(0, '女'),
(1, '男')
)
gender = models.SmallIntegerField(verbose_name='性别,男1,女0', choices=gender_choices)
2.views.py
class Myform(ModelForm):
#支持自定义字段
xx = form.CharField('...')
class Meta:
model = UserInfo
fields = ['name','password','age','creat_time','depart','gender','xx']
def user_add(request):
"""添加用户(原始方式)"""
if request.method == "GET":
form = Myform()
return render(request, 'user_add.html', {
'form':form})
3.user_add.html中
<form class="form-horizontal" method="post">
{% for field in form%}
{# 会循环将form中的字段转换成HTMl渲染在页面上 #}
{
{field}}
{% endfor %}
</form>
7.4 ユーザーの編集
from django import forms
class UserModelForm(forms.ModelForm):
name = forms.CharField(min_length=3, max_length=16, label='姓名')
# password = forms.CharField(label='密码', validators=re.compile(r'\d+'))
class Meta:
model = models.UserInfo
fields = ['name', 'password', 'age', 'account', 'creat_time', 'gender', 'depart']
# 这种方式太麻烦了
# widgets = {
# 'name': forms.TextInput(attrs={'class': 'form-control'}),
# 'age': forms.PasswordInput(attrs={'class': 'form-control'}),
# 'account': forms.TextInput(attrs={'class': 'form-control'}),
# 'creat_time': forms.TextInput(attrs={'class': 'form-control'}),
# 'gender': forms.TextInput(attrs={'class': 'form-control'}),
# 'depart': forms.TextInput(attrs={'class': 'form-control'}),
# }
# 简写:重写初始化方法,找到对应的插件,为其加上属性
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# 循环找到所有插件, 为其加入class= 'form-control'
for name, field in self.fields.items():
print(name, field)
field.widget.attrs = {
'class': 'form-control', 'placeholder': f"请输入{
field.label}"}
def user_add_bymodelform(request):
"""添加用户 by ModelForm"""
if request.method == "GET":
form = UserModelForm()
return render(request, 'user_add_bymodelform.html', {
'form': form})
# POST提交数据,数据校验,存入数据库
form = UserModelForm(data=request.POST)
if form.is_valid():
print(form.cleaned_data)
# 如果数据合法,保存到数据库
form.save()
# 校验失败,返回错误信息
print(form.errors)
return render(request, 'user_add_bymodelform.html', {
'form': form})
def user_edit(request, id):
"""编辑用户"""
row_object = models.UserInfo.objects.filter(id=id).first()
if request.method == "GET":
# 根据id获取要更新的记录
form = UserModelForm(instance=row_object)
return render(request, 'user_edit.html', {
'form': form})
# POST
form = UserModelForm(data=request.POST, instance=row_object)
if form.is_valid():
# data=request.POST默认保存的是用用户输入的值,如果还需要加入一些字段值,可以
# form.instance.字段名 = 新值
form.save()
return redirect('/user/list')
return render(request, 'user_edit.html', {
'form': form})
def user_delete(request, id):
models.UserInfo.objects.filter(id=id).delete()
return redirect('/user/list')
7.5 あいまい検索
# 之前的搜索
models.PrettyNumber.objects.filter(id=XX,number=XXX)
dict_data = {
'id'XX, "number":XXX}
models.PrettyNumber.objects.filter(**dict_data)
Django での数値のあいまい検索:
models.PrettyNumber.objects.filter(id=XX) # id=12
models.PrettyNumber.objects.filter(id__gt=XX) # id大于12
models.PrettyNumber.objects.filter(id__gte=XX) # id大于等于12
models.PrettyNumber.objects.filter(id__lt=XX) # id小于12
models.PrettyNumber.objects.filter(id__lte=XX) # id小于等于12
Django での文字列のあいまい検索:
models.PrettyNumber.objects.filter(number="139") #字符串number筛选出完全等于139
models.PrettyNumber.objects.filter(number__startswith="139") #字符串number筛选出以139开头
models.PrettyNumber.objects.filter(number__endswith="155") #字符串number筛选出以155结尾
models.PrettyNumber.objects.filter(number__contains="999") #字符串number筛选出包含999
models.PrettyNumber.objects.filter(number__startswith="139") #字符串number筛选出以139开头
# 当然,也可以使用字典形式
data_dict = {
"number__contains":"999"}
models.PrettyNumber.objects.filter(**data_dict) #字符串number筛选出包含999
7.6 ページネーション
models.PrettyNumber.objects.all()[:10] # 取到前10
models.PrettyNumber.objects.filter(number__contains ="999")[5:10]
# 数据库的总条数
counts = models.PrettyNumber.objects.all().count()
# 获取price=XXX 的数据条数
counts = models.PrettyNumber.objects.filter(price=XXX).count()
辞書形式を使用します。
data_dict = {"number__contains":"999"}
models.PrettyNumber.objects.filter(**data_dict) #string 数値フィルターで 999 を含むものを除外します
7.6 ページネーション
models.PrettyNumber.objects.all()[:10] # 取到前10
models.PrettyNumber.objects.filter(number__contains ="999")[5:10]
# 数据库的总条数
counts = models.PrettyNumber.objects.all().count()
# 获取price=XXX 的数据条数
counts = models.PrettyNumber.objects.filter(price=XXX).count()