[Web開発] 7. ジャンゴ(2)

ヒント:記事作成後に目次を自動生成することもできますが、生成方法については右のヘルプを参照してください。


1. 部門一覧

1.models.py の下

class Department(models.Model):
    """部门表"""
    title =models.CharField(verbose_name="标题",max_length=32)
    def __str__(self):
        return self.title

2.ビューファイル内の
Def...(request):return(request,'...html')

def depart_list(request):
    """部门类"""
    # 去数据库中获取所有的部门列表
    queryset = models.Department.objects.all()
    return render(request, 'depart_list.html', queryset )

3.Department_list.html ファイルの下

{% extends 'layout.html' %}

{% block content %}
    <div class="container">
        <div class="panel panel-default" style="margin-top: 20px;">
            <!-- Default panel contents -->
            <div class="panel-heading">
                <span class="glyphicon glyphicon-th-list" aria-hidden="true"></span>
                批量上传
            </div>
        <div class="panel-body">
            <form method="post" enctype="multipart/form-data" action="/depart/multi/">
                {% csrf_token %}
                <div class="form-group">
                    <input type="file" name="exc">
                </div>
                <input type="submit" value="上传" class="btn btn-info btn-sm">
            </form>
        </div>
        <div style="margin-bottom: 10px"></div>
            <div class="panel-heading">
                <a class="btn btn-success btn-xs " href="/depart/add/">
                    <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
                    新建部门
                </a>
            </div>

            <!-- Table -->
            <table class="table">
                <thead>
                <tr>
                    <th>id</th>
                    <th>名称</th>
                    <th>操作</th>
                </tr>
                </thead>
                <tbody>
                {% for obj in queryset %}
                    <tr>
                        <th scope="row">{
   
   { obj.id }}</th>
                        <td>{
   
   { obj.title }}</td>
                        <td>
                            <a href="/depart/{
     
     { obj.id }}/edit/" class="btn btn-primary btn-xs ">编辑</a>
                            <a href="/depart/delete/?nid={
     
     { obj.id }}" class="btn btn-danger btn-xs ">删除</a>
                        </td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>
    </div><!-- /.container -->

{% endblock %}

2. 部門管理(追加、削除、変更)


注: 両方の HTML ファイルに部門を追加するには、{%load static %} が必要です
。 1) urls.py の下に path('Depart/add/', views.Depart_add) を作成します。
2) views.py リクエストの下に defDepart_add() を作成します。 )

def depart_add(request):
    """添加部门"""
    if request.method == 'GET':
        return render(request, 'depart_add.html')
    # 获取用户POST提交过来的数据
    title = request.POST.get("title")
    # 保存到数据库
    models.Department.objects.create(title=title)
    # 重定向部门列表
    return redirect("/depart/list/")

3)テンプレートディレクトリにpart_add.htmlを作成

{% extends 'layout.html' %}
{% block content %}
     <div class="container">
        <div class="panel panel-default">
            <div class="panel-heading">新建部门</div>
            <div class="panel-body">
                <form class="form-horizontal" method="post">
                    {% csrf_token %}
                    <div class="form-group">
                        <label class="col-sm-2 control-label">标题</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" placeholder="标题" name="title"/>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-sm-offset-2 col-sm-10">
                            <button type="submit" class="btn btn-primary">提 交</button>
                        </div>
                    </div>
                </form>
            </div>
        </div>

    </div>
{% endblock %}

4) 部門リスト.html ファイルの下に新しい部門を作成し、部門/追加/アドレスにリンクします。

部門の削除
1) urls.py の下に path('Depart/delete/', views.Depart_delete) を作成します。
2) 削除するために、views.py の下に defDepart_delete(request) を作成します
: href="/payment/delete/?nid= { {obj.id }}」

def depart_delete(request):
    """删除部门"""
    # 获取id
    nid = request.GET.get('nid')
    # 删除
    models.Department.objects.filter(id=nid).delete()
    # 跳转(重定向回部门列表)
    return redirect("/depart/list/")

3) part_list.html ファイルの下の削除ボタン

<a href="/depart/delete/?nid={
     
     { obj.id }}"  class="btn btn-danger btn-xs ">删除</a>

編集部
1) urls.py配下にパス('Depart/< int:nid >/edit/', views.Depart_edit)を作成、
http://127.0.0.1
:8000/Depart/int/edit/edit : href= " /Depart/{ { obj.id }}/edit/"

path('depart/<int:nid>/edit/', views.depart_edit),

2) views.py の下にdefDepart_edit(request, nid )を作成します。

def depart_edit(request, nid):
    """编辑部门"""
    if request.method == "GET":
        # 根据id获取编辑的数据
        row_object = models.Department.objects.filter(id=nid).first()
        print(row_object.id, row_object.title)
        # 重定向到编辑页面
        return render(request, "depart_edit.html", {
    
    "row_object": row_object})
    # 用户提交的标题
    title = request.POST.get("title")
    # 根据id在数据库中进行更新
    models.Department.objects.filter(id=nid).update(title=title)
    # 跳转(重定向回部门列表)
    return redirect("/depart/list/")

3)vaule はデフォルト値を表します。part_list.html ファイルの下の編集ボタンでは、
value="{ { row_object.title }}" となります。

{% extends 'layout.html' %}
{% block content %}
     <div class="container">
        <div class="panel panel-default">
            <div class="panel-heading">修改部门</div>
            <div class="panel-body">
                <form class="form-horizontal" method="post">
                    {% csrf_token %}
                    <div class="form-group">
                        <label class="col-sm-2 control-label">标题</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" placeholder="标题" name="title" value="{
     
     { row_object.title }}"/>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-sm-offset-2 col-sm-10">
                            <button type="submit" class="btn btn-primary">提 交</button>
                        </div>
                    </div>
                </form>
            </div>
        </div>

    </div>
{% endblock %}

3. ユーザー管理のモデルフォームコンポーネントへの移行

データを取得する

insert into app01_userinfo(name,password,age,account,creat_time,gender,depart_id) values("刘乐","1e4q",42,3321.02,"2010-03-11",2,11);

models.py ファイルの下

class UserInfo(models.Model):
    """员工表"""
    name =models.CharField(verbose_name="姓名",max_length=32)
    password =models.CharField(verbose_name="密码",max_length=32)
    age =models.IntegerField(verbose_name="年龄")
    account =models.DecimalField(verbose_name="余额",max_digits=10,decimal_places=2,default=0)
    creat_time =models.DateField(verbose_name="入职时间")
# 有约束     on_delete=models.CASCADE级联删除
    depart = models.ForeignKey(verbose_name="所属部门",to="Department",to_field="id",on_delete=models.CASCADE)
# 链接部分被删除时置空
# depart = models.ForeignKey(to="Department",to_field="id",null=True,blank=True,on_delete=models.SET_NULL)
# 在django中做的约束
    gender_choices=(
        (1,"男"),
        (2,"女"),
    )
    gender =models.SmallIntegerField(verbose_name="性别",choices=gender_choices)

user_list.html ファイルの下

"""注意:return render(request,"user_list.html", {"queryset": queryset})(双引号、花括号、冒号)"""
<th>{
   
   { obj.id }}</th>
<td>{
   
   { obj.name }}</td>
<td>{
   
   { obj.password }}</td>
<td>{
   
   { obj.age }}</td>
<td>{
   
   { obj.account }}</td>
<td>{
   
   { obj.creat_time|date:"Y-m-d" }}</td>#日期的读取
<td>{
   
   { obj.get_gender_display }}</td>#性别
<td>{
   
   { obj.depart.title }}</td> #关联其他表的读取

Django コンポーネントを使用しない場合: ModelForm コンポーネント

ユーザーを追加する

def user_add(request):
    if request.method == "GET":
        context = {
    
    
            'gender_choices': models.UserInfo.gender_choices,
            'depart_list': models.Department.objects.all()
        }
        return render(request, "user_add.html", context)
    name = request.POST.get("name")
    password = request.POST.get("password")
    age = request.POST.get("age")
    account = request.POST.get("account")
    # from django.utils import timezone
    # creat_time = timezone.now()
    creat_time = request.POST.get("creat_time")
    gender = request.POST.get("gender")
    depart_id = request.POST.get("depart_id")
    models.UserInfo.objects.create(name=name, password=password, age=age,
                                   account=account, creat_time=creat_time,
                                   gender=gender, depart_id=depart_id)

    return redirect("/user/list/")

Django コンポーネントを利用する:
views.py ファイルの下のModelForm コンポーネント

class UserModelForm(forms.ModelForm):
    # name = forms.CharField(min_length=3, label="用户名")
    class Meta:
        model = models.UserInfo
        fields = ["name", "password", "age", "account", "creat_time", "gender", "depart"]
        # widgets = {
    
    
        #     "name":forms.TextInput(attrs={"class":"col-sm-2 control-label"})
        # }

    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": field.label}

GET の下にユーザーを追加します
: form = UserModelForm()
POST の下に: form = UserModelForm(data=request.POST)

from django import forms
def use_model_form_add(request):
    """添加用户"""
    if request.method == "GET":
        form = UserModelForm()
        return render(request, 'user_model_form_add.html', {
    
    "form": form})
    #     用户提交的数据进行校验,如果合法再保存到数据库
    form = UserModelForm(data=request.POST)
    if form.is_valid():
        # print(form.cleaned_data)
        form.save()
    return render(request, 'user_model_form_add.html', {
    
    "form": form})

html ファイル内:
<span style="color:red">{ { field.errors.0 }}</span > はエラーメッセージ
英語プロンプト情報を中国語プロンプト情報に変更する場合は、設定を変更する必要があります。 py ファイルを
LANGUAGE_CODE. = 'zh-hans'

#settings.py
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'
#html
<div class="col-sm-offset-2 col-sm-10">
   <label>{
    
    {
    
     field.label }}</label>
   {
    
    {
    
     field }}
   <span style="color: red">{
    
    {
    
     field.errors.0 }}</span>
{
    
    # <input type="text" class="form-control" placeholder="年龄" name="age"/>#}
</div>

"ユーザーの編集
GET: form = UserModelForm(instance=row_object)
POST: form = UserModelForm(data=request.POST、instance=row_object)

#views.py
from django import forms
def user_edit(request, nid):
    """编辑用户"""
    # 根据id去数据库获取要编辑的那一行数据
    row_object = models.UserInfo.objects.filter(id=nid).first()
    if request.method == "GET":
        # instance=row_object表示将数据库中获取的那行的每一个值都显示在页面上
        form = UserModelForm(instance=row_object)
        return render(request, 'use_edit.html', {
    
    "form": form})

    form = UserModelForm(data=request.POST, instance=row_object)
    if form.is_valid():
        form.save()
        return redirect('/user/list')
    return render(request, 'user_edit.html', {
    
    "form": form})

ユーザーを削除する

def user_delete(request, nid):
    """删除用户"""
    models.UserInfo.objects.filter(id=nid).delete()
    return redirect('/user/list/')

4. モデルフォームの例: きれいなアカウントの操作

#urls.py
#<int:nid>表明要传递nid这个值到views.py文件中
path('pretty/list/', views.pretty_list),
     path('pretty/add/', views.pretty_add),
     path('pretty/<int:nid>/edit/', views.pretty_edit),
     path('pretty/<int:nid>/delete/', views.pretty_delete),

まず、models.py ファイルの下で PrettyNum クラスを定義し、djando コマンドを使用してデータベース テーブルを生成します (python manage.py makemigrations; python manage.py merge)。データベースでは app01_prettynum データ テーブルのみが使用可能です。

#models.py
class PrettyNum(models.Model):
    """靓号表"""
    mobile = models.CharField(verbose_name="电话", max_length=11)
    price = models.IntegerField(verbose_name="单价",default=0)

    level_choices = (
        (1, "1级"),
        (2, "2级"),
        (3, "3级"),
        (4, "4级"),
    )
    level = models.SmallIntegerField(verbose_name="级别", choices=level_choices,default=1)

    status_choices = (
        (1, "已占用"),
        (2, "未占用"),
    )
    status = models.SmallIntegerField(verbose_name="状态", choices= status_choices,default=2)

かわいいアカウントを追加する

#ModelForm类
from django import forms
from django.core.validators import RegexValidator

class PrettyModelForm(forms.ModelForm):
    # 验证:方法1
    mobile = forms.CharField(
        label="手机号",
        # validators=[RegexValidator(r'^159[0-9]+$','数字必须以159开头')],
        validators=[RegexValidator(r'^1[3-9]\d{9}$', '手机号格式错误')],
    )

    class Meta:
        model = models.PrettyNum
        # fields = ['mobiles','price','level','status']  一一列举
        # exclude = ['level']  排除
        fields = "__all__"

    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": field.label}
            
	# # #  验证:方法2(钩子方法,对用户数据进行验证)
#     def clean_mobile(self):
#         txt_mobile = self.cleaned_data["mobile"]
#         if len(txt_mobile) !=11:
#             raise ValidationError("手机号格式错误")
#         return txt_mobile


ここに画像の説明を挿入します

#views.py
def pretty_add(request):
    if request.method == 'GET':
        form = PrettyModelForm()
        return render(request, 'pretty_add.html', {
    
    "form": form})
    row_object = models.PrettyNum.objects.create()
    form = PrettyModelForm(data=request.POST, instance=row_object)
    if form.is_valid():
        form.save()
        return redirect('/pretty/list')
    return render(request, 'pretty_add.html', {
    
    "form": form})


views.py ファイルの下の PrettyEditModelForm を編集します。ここで、
mobile = Forms.CharField(disabled=True,label="携帯電話番号") は、「携帯電話番号」が編集中に表示されますが、変更できないことを意味します。

#ModelForm类
from django import forms

class PrettyEditModelForm(forms.ModelForm):
    mobile = forms.CharField(disabled=True,label="手机号")
    class Meta:
        model = models.PrettyNum
        # fields = ['mobiles','price','level','status']  一一列举
        # exclude = ['level']  排除
        fields = "__all__"

    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": field.label}
"""确保编辑的手机号在原数据中没有重复。编辑对象的id:self.instance.pk"""
	 def clean_mobile(self):
			#print(self.instance.pk)
	        txt_mobile = self.cleaned_data["mobile"]
	        exists=models.PrettyNum.objects.exclude(id=self.instance.pk).filter(mobile=txt_mobile).exists()
	        if exists:
	            raise ValidationError("手机号已存在")
	        #if len(txt_mobile) !=11:
				#raise ValidationError("手机号格式错误")
	        return txt_mobile
#views.py
def pretty_edit(request, nid):
    row_object = models.PrettyNum.objects.filter(id=nid).first()
    if request.method == 'GET':
        form = PrettyEditModelForm(instance=row_object)
        return render(request, 'pretty_edit.html', {
    
    "form": form})
    form = PrettyEditModelForm(data=request.POST, instance=row_object)
    if form.is_valid():
        form.save()
        return redirect('/pretty/list')
    return render(request, 'pretty_edit.html', {
    
    "form": form})

ここに画像の説明を挿入します

かわいいアカウントを削除する

def pretty_delete(request, nid):
    models.PrettyNum.objects.filter(id=nid).delete()
    return redirect('/pretty/list/')

適切なアカウントを検索し
てパラメータを取得するにはどうすればよいですか? q=
pretty_list.html ページに検索ボックスを追加します: name=" q "、送信

<div class="col-lg-3 clearfix" style="float: right;display: block">
                    <form method="get">
                        <div class="input-group">
                        <span class="input-group-btn">
                        <button class="btn btn-default" type="submit">
                            <span class="glyphicon glyphicon-zoom-in" aria-hidden="true"></span>
                        </button>
                         </span>
                            <input type="text" name='q' class="form-control" placeholder="Search for..."
                                   value="{
     
     { search_data }}">
                        </div><!-- /input-group -->
                    </form>

靓号列表views.py中に追加
data_dict = {}
search_data = request.GET.get(' q ', “”)
if search_data:
data_dict[“mobile__contains”] = search_data
queryset = models.PrettyNum.objects.filter(* *data_dict).order_by(“-level”)

美しいアカウントのリスト

def pretty_list(request):
    data_dict = {
    
    }
    search_data = request.GET.get('q', "")
    if search_data:
        data_dict["mobile__contains"] = search_data

    queryset = models.PrettyNum.objects.filter(**data_dict).order_by("-level")

    page_object = Pagination(request, queryset)  # 分页

    context = {
    
    
        "queryset": page_object.page_queryset,
        "search_data": search_data,  # 分完页的数据
        "page_string": page_object.html()  # 页码
    }
    return render(request, 'pretty_list.html', context)

models.PrettyNum.objects.filter(mobile="1612313223",id=7)
data_lict ={
    
    "mobile":"168324145","id":7}
models.PrettyNum.objects.filter(**data_lict)

models.PrettyNum.objects.filter(mobile__contains=1999)
#对于数字类型:
#filter(id=12)            #等于12
#filter(id__gt=12)        #大于12
#filter(id__gte=12)       #大于等于12
#filter(id__lt=12)        #小于12
#filter(id__lte=12)       #小于等于12
#filter(id=12)
#对于字符串类型:
#filter(mobile=”1999”)
#filter(mobile__startswith=”1999”)         #筛选1999开头
#filter(mobile__endswith=”1999”)
#filter(mobile__contains=”1999”)

5. カスタム ページング コンポーネント

4. ページングコンポーネントの作成
appo01 ディレクトリに utils ディレクトリを作成し、pagination.py ファイルを作成します

"""
自定义分页组件  
"""
from django.utils.safestring import mark_safe
class Pagination(object):
    def __init__(self,request,queryset,page_size=10,page_param="page",plus=5):
        """
        :param request: 请求对象
        :param queryset: 符合条件的数据
        :param page_size: 每页显示多少条数据
        :param page_param: 在URL中传递的获取分页的参数 例如/pretty/list/?page=4
        :param plus:显示当前页的前或后几页(页码)
        """
        import copy
        query_dict = copy.deepcopy(request.GET)
        query_dict._mutable = True

        self.query_dict = query_dict

        page = request.GET.get(page_param, "1")
        if page.isdecimal():
            page=int(page)
        else:
            page=1
        self.page =page
        self.page_size=page_size
        self.page_param=page_param

        self.start = (page - 1) * page_size
        self.end = page * page_size

        self.page_queryset = queryset[self.start:self.end]

        total_count = queryset.count()
        total_page_count, div = divmod(total_count, page_size)
        if div:
            total_page_count += 1
        self.total_page_count =total_page_count
        self.plus=plus

    def html(self):
            # 计算出显示当前页的的前五页后五页
        # 数据较少,显示全部页码
        if self.total_page_count <= 2 * self.plus + 1:
            start_page = 1
            end_page = self.total_page_count
        else:
            # 数据较多
            # 当前页<5
            if self.page <= self.plus:
                start_page = 1
                end_page = 2 * self.plus + 1
            else:
                # 当前页>5
                # 当前页+5>总页面
                if (self.page + self.plus) > self.total_page_count:
                    start_page = self.total_page_count - 2 * self.plus
                    end_page = self.total_page_count
                else:
                    start_page = self.page - self.plus
                    end_page = self.page + self.plus

        # 页码
        page_str_list = []
        self.query_dict.setlist(self.page_param,[1])

        first = '<li><a  href="?{}">首页</a></li>'.format(self.query_dict.urlencode())
        page_str_list.append(first)
            # 上一页
        if self.page > 1:
            self.query_dict.setlist(self.page_param,[self.page-1])
            prev = '<li><a  href="?{}"></a></li>'.format(self.query_dict.urlencode())
        else:
            prev = '<li><a  href="?{}"></a></li>'.format(1)
        page_str_list.append(prev)

        for i in range(start_page, end_page + 1):
            self.query_dict.setlist(self.page_param,[i])
            if i == self.page:
                ele = '<li class="active"><a  href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
            else:
                ele = '<li><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
            page_str_list.append(ele)

        if self.page >= self.total_page_count:
            self.query_dict.setlist(self.page_param,[self.page+1])
            next = '<li><a  href="?{}"></a></li>'.format(self.query_dict.urlencode())
        else:
            self.query_dict.setlist(self.page_param,[self.total_page_count])
            next = '<li><a  href="?{}"></a></li>'.format(self.query_dict.urlencode())
        page_str_list.append(next)

        # 尾页
        self.query_dict.setlist(self.page_param,[self.total_page_count])
        end = '<li><a  href="?{}">尾页</a></li>'.format(self.query_dict.urlencode())
        page_str_list.append(end)
        search_string = """             
            <li >
                <form method="get" style="float: left">
                    <input  type="text" 
                            class="form-control" name="page" placeholder="页码" 
                            style="width: 80px;position: relative;float: left;display: inline-block;border-radius: 0">
                    <button type="submit" class="btn btn-default">跳转</button>
                </form>
            </li>
        """
        page_str_list.append(search_string)
        page_string = mark_safe("".join(page_str_list))
        return page_string

知らせ:

"""如果以后想要使用这个分页组件,你需要做如下几件事:

在视图函数views.py函数中:
def pretty_list(request):

#1.根据所需筛选数据
    queryset = models.PrettyNum.objects.all()
#2.实例化分页对象
    page_object = Pagination(request,queryset,page_size=2)

    context ={
        "queryset": page_object.page_queryset, #分完页的数据
         "page_string": page_object.html() #生成页码
    }
    return render(request, 'pretty_list.html',context)

在html页面中
                <ul class="pagination">
                    {
   
   { page_string }}
                </ul>
"""

ここに画像の説明を挿入します

pretty_list views.py
ファイルは上記のとおりで、事前にインポートする必要があります。
from app01.utils.pagination import Pagination
pretty_list.html ファイル

{% extends 'layout.html' %}

{% block content %}
    <div class="container">
        <div class="panel panel-default" >
            <!-- Default panel contents -->
            <div class="panel-heading" >
                <a class="btn btn-success btn-xs " href="/pretty/add/">
                    <span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
                    添加靓号
                </a>

                <div class="col-lg-3" style="float: right;display: block;padding-bottom: 5px">
                    <form method="get">
                        <div class="input-group">
                        <span class="input-group-btn">
                        <button class="btn btn-default" type="submit">
                            <span class="glyphicon glyphicon-zoom-in" aria-hidden="true"></span>
                        </button>
                         </span>
                            <input type="text"name='q' class="form-control" placeholder="Search for..."
                                   value="{
     
     { search_data }}">
                        </div><!-- /input-group -->
                    </form>
                </div>

            </div>

            <!-- Table -->
            <table class="table">
                <thead>
                <tr>
                    <th>id</th>
                    <th>电话号</th>
                    <th>单价</th>
                    <th>级别</th>
                    <th>状态</th>
                    <th>操作</th>
                </tr>
                </thead>
                <tbody>
                {% for obj in queryset %}
                    <tr>
                        <th scope="row">{
   
   { obj.id }}</th>
                        <td>{
   
   { obj.mobile }}</td>
                        <td>{
   
   { obj.price }}</td>
                        <td>{
   
   { obj.get_level_display }}</td>
                        <td>{
   
   { obj.get_status_display }}</td>
                        <td>
                            <a href="/pretty/{
     
     { obj.id }}/edit/" class="btn btn-primary btn-xs ">编辑</a>
                            <a href="/pretty/{
     
     { obj.id }}/delete/" class="btn btn-danger btn-xs ">删除</a>
                        </td>
                    </tr>
                {% endfor %}
                </tbody>
            </table>
        </div>

        <div>
            <nav>
                <ul class="pagination">
                    {
   
   { page_string }}
                </ul>
            </nav>
        </div>

    </div><!-- /.container -->


{% endblock %}

6. datepick time プラグインの使用

datepickのjsとcssをlayout.htmlテンプレートファイルに導入します。

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap-datepicker.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap-datepicker.min.js"></script>

1. id="dt" をフィールドに直接追加します。

<script>
	$(function (){
      
      
	        $('#dt').datepicker({
      
      
	            format:"yyyy-mm-dd",
	            startDate:'0',
	            language:"zh-CN.js:6",
	            autoclose:true
	        });
	    })
</script>

2.モデルフォームに基づく

#id_フィールド名: id_creat_time

<script>
    $(function (){
      
      
        $('#id_creat_time').datepicker({
      
      
            format:"yyyy-mm-dd",
            startDate:'0',
            language:"zh-CN.js:6",
            autoclose:true
        });
    })
    </script>

7. ブートストラップ スタイルで ModelForm をカスタマイズする

appo01 ディレクトリに utils ディレクトリを作成し、bootstrap.py ファイルを作成します。
ここに画像の説明を挿入します

from django import forms

class BootstrapModelForm(forms.ModelForm):
    bootstrap_exclude_fields = ['img']
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 循环找到所有的插件,添加了"class":"form-control"得样式
        for name, field in self.fields.items():
            if name in self.bootstrap_exclude_fields:
                continue
            # 字段中有属性,保留原来的属性,没有属性,才增加
            if field.widget.attrs:
                # 有则添加字典值
                field.widget.attrs["class"] = "form-control"
                field.widget.attrs["placeholder"] = field.label
            else:
                field.widget.attrs = {
    
    
                    "class": "form-control",
                    "placeholder": field.label
                }

BootstrapModelForm を継承し、クラス Meta を定義する

class UserEditModelForm(BootstrapModelForm):
    class Meta:
        model = models.UserInfo
        fields = ["name", "password", "age"]

注:事前にお見積りが必要です

from app01.utils.bootstrap import BootstrapModelForm

おすすめ

転載: blog.csdn.net/qq_46644680/article/details/132827978