zoukankan      html  css  js  c++  java
  • 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__方法,来保证从数据库获取最新的数据。

  • 相关阅读:
    第十四周总结
    第十三周总结
    第十一周学习总结
    《软件需求》 阅读笔记
    第十周总结
    Echarts基础
    HTML中form表单text填写内容时的约束
    代码整洁之道 阅读笔记五
    pandas中的None和NaN
    pandas中的replace用法
  • 原文地址:https://www.cnblogs.com/metianzing/p/7738242.html
Copyright © 2011-2022 走看看