02. 事例プロジェクトデモ

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. データベーステーブルの生成

  1. データベースにログインします: mysql -u root -p

形式: 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) を指定する必要はありません。

  1. データベースを作成します。

データベースを作成します day16 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

すべてのデータベースを表示します。

データベースを表示します。

  1. Djangoh で設定ファイルを変更し、データベースに接続します。

settings.py のデータベース構成を変更します。

DATABASES = {
    
    
    'default': {
    
    
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',  # 数据库名字
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',  # 要连接哪台机器上的MySQL
        'PORT': '3306'  # 端口号
    }
}
  1. Django コマンドを使用してデータベース テーブルを生成するか、[ツール] > [manage.py タスクの実行] を使用します。

Python manage.py makemigrations

python manage.py 移行

生成されたテーブルを表示します。

データ名を使用する;
テーブルを表示する;
説明 app01_Department;

  1. 静的ファイル (static>css/js/img/plugins) とテンプレート ファイル テンプレートを作成します。

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

おすすめ

転載: blog.csdn.net/qq_45801179/article/details/132392801