ModelForm

Posted x-h-15029451788

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 %}

以上是关于ModelForm的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ModelForm 中使用 forms.ChoiceField()?

123.ModelForm的使用

表单-modelform

Django之ModelForm使用

12_模型表单modelForm的使用

Django ModelForm 覆盖 __init__