其他分享
首页 > 其他分享> > 利用ModelForm在页面实现数据的增删改查

利用ModelForm在页面实现数据的增删改查

作者:互联网

1、初始数据(model)

1.1、创建数据

from django.db import models
from multiselectfield import MultiSelectField   #需要pip install django-multiselectfield

	# 这里是对后续再model中使用choices是设置的元组。
products_choices = (('phone', '手机'),
                  ('PC', '个人电脑'),)

class Clients(models.Model):
    """
    创建一个客户信息的表
    """
    qq = models.CharField(verbose_name='QQ', max_length=64, unique=True, help_text='QQ号必须唯一')  # verbose_name 是在django admin或表单的认证时中显示的名字
    	 # unique是唯一
         # help_text也是在django admin或表单的认证时显示的提示信息。
    name = models.CharField('姓名', max_length=32, blank=True, null=True, help_text='与客户交流后,请改为真实姓名')
    sex_type = (('male', '男性'), ('female', '女性')) 
    	# 做一个元组,用于存放对应信息,在数据库中存放male,显示时,可以显示男性。
    sex = models.CharField("性别", choices=sex_type, max_length=16, default='male', blank=True, null=True)
    	# 从形参角度看,第一个参数就是verbose_name,这里等价于verbose_name="性别"
        # choices 指向了对应的元组,存的是male或者female。
        # default 默认值
    birthday = models.DateField('出生日期', default=None, help_text="格式yyyy-mm-dd", blank=True, null=True)
    	# DateField ,记录日期类的比较合适。
    phone = models.BigIntegerField('手机号', blank=True, null=True) 
    	# 这里只是为了展示BigIntegerField这个类型,真实使用时,最好用CharField
    products = MultiSelectField("咨询课程", choices=products_choices)
    	# MultiSelectField 在admin里可以显示多选框。
    last_consult_date = models.DateField("最后跟进日期", auto_now_add=True) 
    	# auto_now_add ,自动增加日期。这是DateField才有
    next_date = models.DateField("预计再次跟进时间", blank=True, null=True)
    	# null 表示数据库里可以是空
        # blank 用于表单的认证时可以为空。
        # 为什么有两种空,这是为了实现四种组合,有些数据,我们可以由系统记录,但是不希望是用户在表单中填写,这时,系统中 null = True , blank = False
    introduce_from = models.ForeignKey('self', verbose_name="转介绍于其他客户", blank=True, null=True,on_delete=models.CASCADE)  
    	# self指的就是自己这个表,和下面写法是一样的效果,Foreignkey的自自引用写法。
        # on_delete=models.CASCADE,表示是否删除联动,这里表示的是不联动,主的删掉了,关联的不删。
        
        
        
    class Meta:
        # 这个是表单和人交互时的元类,下面的内容,便于表单展示。
        unique_together = ('name','phone')  # 联合唯一。这个组合仅用于演示
        ordering = ['id',]   				# 按照id排序
        verbose_name='客户信息表'  			 # 表名
        verbose_name_plural = '客户信息表'	 # 在表单里可以显示的名字

    def __str__(self):
        return self.name+":"+self.qq     # 在django admin的表单中,显示一行数据的时候,会显示这个名称,便于识别是哪一行数据。
    

1.2、执行model中的操作

python manage.py makemigrations
python manage.py migrate

2、创建ModelForm表单

在app下创建myforms.py,创建对应的表单类,表单最大价值是可以制定多种合规性检查。

# myforms.py
from sales import models
from django import forms


class CustomerModelForm(forms.ModelForm):
    class Meta:
        model = models.Clients  # Clients就是model中的类。
        fields = '__all__'		# 可以在这里过滤字段fields =('qq','name'),也可以在页面显示的时候再过滤

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        for field_name, field in self.fields.items():	# 按照字典的方式打开。
            from multiselectfield.forms.fields import MultiSelectFormField  
            if not isinstance(field,MultiSelectFormField):  #这里是为了给使用了MultiSelectFormField的进行过滤,否则页面会乱码
                field.widget.attrs.update({'class': 'form-control'})  #给field增加页面显示的属性。

3、创建URL

创建路径

# urls.py
from django.conf.urls import url
from django.contrib import admin
from sales import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^clients/', views.clients,name='clients'),
    url(r'^addclients/', views.editClients,name='addclients'),
    url(r'^editclients/(\d+)', views.editClients,name='editclients'),
]

4、创建views

# views.py

from django.shortcuts import render,HttpResponse,redirect
from django.http import JsonResponse
from django import forms
from . import models
from crm import myforms

# 创建查询
def clients(request):

    all_clients=models.Clients.objects.all()
    return render(request,'Customer.html', {'all_clients':all_clients},)

# 增加和修改
def addEditClients(request,n=None):
    old_obj = models.Clients.objects.filter(pk=n).first()
    label = '编辑客户信息' if n else '添加客户'
    if request.method == 'GET':
        client_form_obj = myforms.ClientsModelForm(instance=old_obj)
        return render(request,'edit_Clients.html',{'client_form_obj':client_form_obj,'label':label})

    elif request.method == 'POST':
        book_form_obj = myforms.ClientModelForm(request.POST,instance=old_obj)
        if client_form_obj.is_valid():  # 表单校验
            client_form_obj.save()		# 通过了保持
            return redirect('clients')
        else:
            return render(request, 'edit_Client.html', {'client_form_obj': client_form_obj,'label':label})

5、配置静态文件

5.1、settings中

# settings.py中配置

import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

INSTALLED_APPS = [
    'clients.apps.ClientsConfig',
    # 'clients'  app的名字
]

# 配置数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'crm',
        'HOST':'127.0.0.1',
        'PORT':3306,
        'USER':'root',
        'PASSWORD':'123456',
    }
}

STATIC_URL = '/static/'   #在url中传输用这个字段

STATICFILES_DIRS=[
    os.path.join(BASE_DIR,'static'),   #这里是本地的static文件夹名称,可以自行配置
]

5.2、使用bootstrap

1、本地配置,使用静态文件

image-20220507203853474

2、还可以使用CDN配置。

<link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">

6、创建页面template

6.1、创建模板-load-block

{#base.html#}

{% load static %}  //加载static静态文件夹
<!DOCTYPE html>
<html lang="en">
<head>
    
    {% block title %}
    {% endblock %}
</head>
<body>

    {% block content %}
    {% endblock %}
    
    
</body>
</html>

6.2、创建展示页-for-forloop

{% extends 'starter.html' %}

{% block title %}
<h1 class="m-0">所有客户列表</h1>
{% endblock %}

{% block content %}

<div class="card">
              <!-- /.card-header -->
              <div class="card-body">
                  <a href="{% url 'addclients' %}" class="btn btn-primary">添加用户</a>

                  <table class="table table-bordered table-striped">
                      <thead>
                      <tr>
                          <th>序号</th>
                          <th>QQ</th>
                          <th>姓名</th>
                          <th>性别</th>
                          <th>操作</th>
                      </tr>
                      </thead>
                      <tbody>
                      {% for client in all_clients %}
                          <tr>
                            <td>{{ forloop.counter }}</td>
                            <td>{{ customer.qq }}</td>
                            <td>{{ customer.name }}</td>
                            <td>{{ customer.sex }}</td>
                            <td>
      <a href="{% url 'editclients' client.pk %}"><i class="fa fa-edit"></i></a>
                            </td>
                          </tr>

                      {% endfor %}
                      </tbody>
                  </table>
             </div>
              <!-- /.card-body -->
            </div>
{% endblock %}

6.3、创建和修改base页

这个页面是用于被修改和增加时引用的页面。

//add_edit_clients.html.html

<!DOCTYPE html>
<html lang="en">
<head>
    
    <title>Title</title>
</head>
<body>

 <form class="form-horizontal" action="" method="post" novalidate>
 {% csrf_token %}
    {% for field in cliets_form_obj %}
          <div class="form-group">

            <label for="{{ field.id_for_label }}" class="col-sm-2 control-label ">{{ field.label }}</label>
            <div class="col-sm-8">{{ field }}</div>
            <span class="text-danger">{{ field.errors.0 }}</span>

          </div>
    {% endfor %}

  <div class="form-group">
    <div class="col-sm-offset-2 col-sm-10">
      <button class="btn btn-primary">提交</button>
    </div>
  </div>
</form>

</body>
</html>

6.4、创建修改和添加页面使用include

{% extends 'starter.html' %}

{% block header_info %}
<h1>{{ label }}</h1>
{% endblock %}


{% block content %}

 {% include 'add_edit_clients.html' %}

{% endblock %}

标签:name,models,True,clients,改查,django,增删,import,ModelForm
来源: https://www.cnblogs.com/lvjinfeng/p/16244110.html