Django Form补充

Posted 始怡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django Form补充相关的知识,希望对你有一定的参考价值。

我们写完项目后,当发现某个输入框是input框,把它更换为select框更合适时,这时我们可以通过Django Form 便捷的更改其为select框。 重写模型类的某个字段,即会重写其构造。 URL:

from django.conf.urls import url
from app01 import views

urlpatterns = [

    url(r\'^aaa/\', views.aaa),

]

 models:

class Department(models.Model):
    """
    部门表
    """
    title = models.CharField(verbose_name=\'部门名称\', max_length=16)

    def __str__(self):
        return self.title


class UserInfo(models.Model):
    """
    员工表
    """
    name = models.CharField(verbose_name=\'员工姓名\', max_length=16)
    username = models.CharField(verbose_name=\'用户名\', max_length=32)
    password = models.CharField(verbose_name=\'密码\', max_length=64)
    email = models.EmailField(verbose_name=\'邮箱\', max_length=64)

    depart = models.ForeignKey(verbose_name=\'部门\', to="Department")


    def __str__(self):
        return self.name

 views:

from django.forms import Form, fields, widgets
from app01 import models
from django.forms.models import ModelChoiceField
from django.shortcuts import render


class UserInfoForm(Form):
    name = fields.CharField(required=True, error_messages={\'required\': \'用户名不为空\'})
    email = fields.EmailField(required=True)

    part = fields.ChoiceField()
    # user_type = ModelChoiceField(queryset=models.Department.objects.all())

    def __init__(self,*args,**kwargs):
        super(UserInfoForm,self).__init__(*args,**kwargs)
        self.fields[\'part\'].choices=models.Department.objects.values_list(\'id\',\'title\')


def aaa(request):
    if request.method == "GET":
        form = UserInfoForm()
        return render(request, \'aaa.html\', {\'form\': form})

 templates:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="x-ua-compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
</head>
<body>
<form>
    {% csrf_token %}
    {{ form.as_p }}
</form>
</body>
</html>

 值得注意的点:

user_type = ModelChoiceField(queryset=models.Department.objects.all())

 通过这种方式实现页面显示user_type字段的select框,但是需要注意这种方式依赖类的__str__方法。

      

 

所以,推荐使用下面这种方式:

part = fields.ChoiceField()  #单选

#part = fields.MultipleChoiceField()  #支持多选

def __init__(self,*args,**kwargs):
        super(UserInfoForm,self).__init__(*args,**kwargs)
        self.fields[\'part\'].choices=models.Department.objects.values_list(\'id\',\'title\')

 

 

另外,我们可能还会这样写:

part = fields.ChoiceField(choices = models.Department.objects.values_list(\'id\', \'title\'))

 一行代码搞定的事,为什么要写四行代码? 事实上,当我们新增一个部门时,这一行代码就会暴露出他的问题:页面上显示的还是增加前的部门。 那么怎么解决呢?

继承父类__init__方法即可搞定。因为每发一次请求,就会执行视图函数的form = UserInfoForm()这行代码,即实例化UserInfoForm类生成一个对象,这将自动执行类的__init__方法,来保证从数据库获取最新的数据。

 

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

Django-form组件补充

Django Form补充

django补充和form组件

Django_Form表单补充

Django知识补充

07: Django 学习补充