• ModelForm


    ModelForm

    为了简单我们今天不撩妹,专聊一个神奇的宝贝组件modelform,看到这个单词我们就明白这个组件就是把model和form组合起来,大家记住了!
    就比如我们在使用的数据库中建立了一个客户表,字段有姓名,年龄,爱好,邮箱,电话,住址,注册,老婆姓名(这是老王最爱的)等一大推消息,创建思路如下:
     1.我们在html文件里使用form表单罗列这些字段,让用户自己填写,
     2.只要使用了ModelForm就绕开了form的复杂性.直接来干就行,他早就在内部为我们生成好了
     
    

    使用:

    1.首先在py文件中导入ModelForm
    from django.forms import ModelForm
    

    在视图函数类定义一个类,记住一定要继承ModelForm,在这个类中在写另一个原类Meta(规定的 注意首字母大写)

    class CustomerModelForm(forms.ModelForm):
        class Meta:
            model=models.Customer
            fields='__all__'
            exclude=['delete_status']
        def __init__(self,*args,**kwargs):
            super().__init__(*args,**kwargs)
            for name, field in self.fields.items():   
                if name=='course':
                    continue
    
                field.widget.attrs.update({'class':'form-control'})
    

    Model.py

    class Customer(models.Model):
        '''
        客户表(最开始大家都是客户,销售就是不停的撩你,你还没有交钱上床就是客户)
        '''
    
        qq = models.CharField(verbose_name='QQ',max_length=64,unique=True,help_text='QQ号必须唯一')
        qq_name=models.CharField('QQ昵称',max_length=64,blank=True,null=True)
        name=models.CharField('姓名',max_length=32,help_text='学员报名后请改成真实姓名')# #可为空,有些人就不愿意给自己的真实姓名
        sex_type=(('male','男'),('female','女'))
        sex=models.CharField('性别',choices=sex_type,max_length=16,default='male',blank=True,null=True)#存的是male或者female,字符串
        birthday = models.DateField('出生日期', default=None, help_text="格式yyyy-mm-dd", blank=True, null=True)
        phone = models.BigIntegerField('手机号', blank=True, null=True)  # 手机号改成字符串的,不然不好搜索
        source = models.CharField('客户来源', max_length=64, choices=source_type, default='qq')
        introduce_from = models.ForeignKey('self', verbose_name="转介绍自学员", blank=True, null=True,
                                           on_delete=models.CASCADE)  # self指的就是自己这个表,和下面写法是一样的效果,自关联
    
        course = MultiSelectField("咨询课程", choices=course_choices)  # 多选,并且存成一个列表的格式,通过modelform来用的时候,会成为一个多选框
        class_type = models.CharField("班级类型", max_length=64, choices=class_type_choices, default='fulltime')
        date = models.DateTimeField("咨询日期", auto_now_add=True)  # 这个没啥用昂,我问销售,销售说是为了一周年的时候给客户发一个祝福信息啥的
        last_consult_date = models.DateField("最后跟进日期", auto_now_add=True)  # 考核销售的跟进情况,如果多天没有跟进,会影响销售的绩效等
        next_date = models.DateField("预计再次跟进时间", blank=True, null=True)  # 销售自己大概记录一下自己下一次会什么时候跟进,也没啥用
        consultant = models.ForeignKey('Userinfo', verbose_name="销售", blank=True, null=True, on_delete=models.CASCADE)
        ass_list = models.ManyToManyField('ClassList', verbose_name="已报班级", blank=True)
        delete_status = models.BooleanField(default=False)
    
        class Meta:
            ordering = ['id', ]
            verbose_name = '客户信息表'
            verbose_name_plural = '客户信息表'
    
        def __str__(self):
            return self.name + ":" + self.qq
    

    html

    {% extends 'starter.html' %}
    
    {% load mytags %}
    
    {% block title %}
        {% if tag == 1%}
            公户信息展示
        {% else %}
            我的客户
        {% endif %}
    
    {% endblock %}
    
    
    {% block content %}
    
        <div class="row">
    
            <div class="col-md-3">
                 <form action="">
                    <div class="input-group mb-3">
    
                        <div class="input-group-prepend">
                            <select name="action" id="">
                                <option value="">关键字</option>
    
                                <option value="qq__contains">qq</option>
                                <option value="name__contains">姓名</option>
                            </select>
                        </div>
                        <input type="text" class="form-control" aria-label="Text input with dropdown button" name="kw">
    
                        <button class="btn btn-primary">go</button>
    
    
                    </div>
                </form>
            </div>
    
        </div>
    
        <form action="" method="post">
        {% csrf_token %}
            <div class="input-group mb-3">
    
                <div class="input-group-prepend">
                    <select name="bulk_action" id="">
                        {% if tag == 1 %}
                            <option value="reverse_gs">公户转私户</option>
                        {% else %}
                            <option value="reverse_sg">私户转公户</option>
                        {% endif %}
    
    
                    </select>
                </div>
    
    
                <button class="btn btn-primary">go</button>
    
    
            </div>
    
    
        {% if tag == 1 %}
        <a href="{% url 'customer_add' %}" class="btn btn-primary">添加客户</a>
        {% endif %}
    
    
        <table style="margin-top: 10px;" class="table table-bordered table-hover table-striped">
            <thead>
            <tr>
                <th>
    
    {#                <input type="checkbox">#}
                    #
                </th>
                <th>序号</th>
                <th>QQ</th>
                <th>姓名</th>
                <th>性别</th>
                <th>客户来源</th>
                <th>咨询课程</th>
                <th>状态</th>
                <th>销售</th>
                <th>跟进记录</th>
                <th>操作</th>
    
            </tr>
            </thead>
            <tbody>
            {% for customer in all_customers %}
    
                <tr>
                    <td>
                        <input type="checkbox" name="cids" value="{{ customer.id }}">
                    </td>
                    <td>{{ request|list_number:forloop.counter }}</td>
                    <td>{{ customer.qq }}</td>
                    <td>{{ customer.name }}</td>
                    <td>{{ customer.get_sex_display }}</td>
                    <td>{{ customer.get_source_display }}</td>
                    <td>{{ customer.get_course_display }}</td>
                    <td>{{ customer.get_status_display }}</td>
                    <td>{{ customer.consultant.username|default:'暂无' }}</td>
                    <td>
                        <a href="{% url 'consult_record' %}?cid={{ customer.id }}">查看详情</a>
                    </td>
                    <td>
    {#                    <a href="{% url 'customer_edit' customer.id %}?next={{ request.get_full_path }}" title="编辑"><i class="fa fa-pencil"></i>&nbsp;</a>|   #}
    
                        <a href="{% resolve_url request 'customer_edit' customer.id  %} " title="url编码编辑"><i class="fa fa-pencil"></i>&nbsp;</a>|
                        <a href="{% url 'customer_del' customer.id %}" title="删除">&nbsp;<i class="fa fa-remove"></i></a>
                    </td>
                </tr>
            {% empty %}
                <tr>
                    <td colspan="9" style="text-align: center;">
                        sorry,没有查询相关用户信息,请核对后再查!!!!!
                    </td>
                </tr>
    
            {% endfor %}
    
    
            </tbody>
    
        </table>
        </form>
    
    {% endblock %}
    
    
  • 相关阅读:
    用硬件卡克隆Linux集群
    基于Linux系统WINE虚拟机技术的研究
    Rpm另类用法加固Linux安全
    基于TC技术的网络流量控制实战
    开源世界里的七剑
    借Stunnel工具保护E-mail服务器
    如何应对DDOS网络攻击(之二)
    如何应对DDOS网络攻击
    Leetcode-983 Minimum Cost For Tickets(最低票价)
    Leetcode-413 Arithmetic Slices(等差数列划分)
  • 原文地址:https://www.cnblogs.com/x-h-15029451788/p/12079201.html
Copyright © 2020-2023  润新知