Django组件-ModelForm

模型表单ModelForm

一、基本用法

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

from django import forms

from django.utils.safestring import mark_safe

from django.core.exceptions import ValidationError

from rbac import models

from django.utils.translation import ugettext_lazy

ICON_LIST = [

    [‘fa-hand-scissors-o‘, ‘<i aria-hidden="true" class="fa fa-hand-scissors-o"></i>‘],

    [‘fa-hand-spock-o‘, ‘<i aria-hidden="true" class="fa fa-hand-spock-o"></i>‘],

]

for item in ICON_LIST:

    item[1] = mark_safe(item[1])

class BootStrapModelForm(forms.ModelForm):

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

        super(BootStrapModelForm, self).__init__(*args, **kwargs)

        # 统一给ModelForm生成字段添加样式

        for name, field in self.fields.items():

            field.widget.attrs[‘class‘] = ‘form-control‘

"""

基本用法:

首先从django.forms导入ModelForm;

编写一个自己的类,继承ModelForm;

在新类里,设置元类Meta;

在Meta中,设置model属性为你要关联的ORM模型,这里是Menu;

在Meta中,设置fields属性为你要在表单中使用的字段列表;列表里的值,应该是ORM模型model中的字段名。

"""

class UserModelForm(BootStrapModelForm):

    confirm_password = forms.CharField(label=‘确认密码‘#

    class Meta:

        model = models.UserInfo

        fields = [‘name‘, ‘email‘, ‘password‘, ‘confirm_password‘, ‘icon‘]

        # fields = ‘__all__‘   #表示将映射的模型中的全部字段都添加到表单类中来

        exclude = [‘pid‘]      #表示将model中,除了exclude属性中列出的字段之外的所有字段,添加到表单类中作为表单字段。

        widgets = {

            ‘name‘: forms.TextInput(attrs={‘class‘: ‘form-control‘}),

            ‘icon‘: forms.RadioSelect(

                choices=ICON_LIST,

                attrs={‘class‘: ‘clearfix‘}

            )

        }

        labels = {

            ‘name‘: ugettext_lazy(‘Writer‘),

        }

        help_texts = {

            ‘name‘: ugettext_lazy(‘Some useful help text.‘),

        }

        error_messages = {

            ‘name‘: {

                ‘max_length‘: ugettext_lazy("This writer‘s name is too long."),

            },

        }

    def clean_confirm_password(self):

        """

        检测密码是否一致

        :return:

        """

        password = self.cleaned_data[‘password‘]

        confirm_password = self.cleaned_data[‘confirm_password‘]

        if password != confirm_password:

            raise ValidationError(‘两次密码输入不一致‘)

        return confirm_password

# 可以在实例化一个表单时通过指定initial参数来提供表单中数据的初始值。

二、字段类型

生成的Form类中将具有和指定的模型字段对应的表单字段,顺序为fields属性列表中指定的顺序。

每个模型字段有一个对应的默认表单字段。比如,模型中的CharField表现成表单中的CharField。模型中的ManyToManyField字段会表现成MultipleChoiceField字段。下面是完整的映射列表:

模型字段 表单字段
AutoField 在Form类中无法使用
BigAutoField 在Form类中无法使用
BigIntegerField IntegerField,最小-9223372036854775808,最大9223372036854775807.
BooleanField BooleanField
CharField CharField,同样的最大长度限制。如果model设置了null=True,Form将使用empty_value
CommaSeparatedIntegerField CharField
DateField DateField
DateTimeField DateTimeField
DecimalField DecimalField
EmailField EmailField
FileField FileField
FilePathField FilePathField
FloatField FloatField
ForeignKey ModelChoiceField
ImageField ImageField
IntegerField IntegerField
IPAddressField IPAddressField
GenericIPAddressField GenericIPAddressField
ManyToManyField ModelMultipleChoiceField
NullBooleanField NullBooleanField
PositiveIntegerField IntegerField
PositiveSmallIntegerField IntegerField
SlugField SlugField
SmallIntegerField IntegerField
TextField CharField,并带有widget=forms.Textarea参数
TimeField TimeField
URLField URLField
  • ForeignKey被映射成为表单类的django.forms.ModelChoiceField,它的选项是一个模型的QuerySet,也就是可以选择的对象的列表,但是只能选择一个。
  • ManyToManyField被映射成为表单类的django.forms.ModelMultipleChoiceField,它的选项也是一个模型的QuerySet,也就是可以选择的对象的列表,但是可以同时选择多个,多对多嘛。
  • 如果模型字段设置blank=True,那么表单字段的required设置为False。 否则,required=True。
  • 表单字段的label属性根据模型字段的verbose_name属性设置,并将第一个字母大写。
  • 如果模型的某个字段设置了editable=False属性,那么它表单类中将不会出现该字段。道理很简单,都不能编辑了,还放在表单里提交什么?
  • 表单字段的help_text设置为模型字段的help_text
  • 如果模型字段设置了choices参数,那么表单字段的widget属性将设置成Select框,其选项来自模型字段的choices。选单中通常会包含一个空选项,并且作为默认选择。如果该字段是必选的,它会强制用户选择一个选项。 如果模型字段具有default参数,则不会添加空选项到选单中。

三、完整示例

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

#models.py

from django.db import models

TITLE_CHOICES = (

    (‘MR‘, ‘Mr.‘),

    (‘MRS‘, ‘Mrs.‘),

    (‘MS‘, ‘Ms.‘),

)

class Author(models.Model):

    name = models.CharField(max_length=100)

    title = models.CharField(max_length=3, choices=TITLE_CHOICES)

    birth_date = models.DateField(blank=True, null=True)

    def __str__(self):              # __unicode__ on Python 2

        return self.name

class Book(models.Model):

    name = models.CharField(max_length=100)

    authors = models.ManyToManyField(Author)

#myforms.py

from django import forms

class AuthorForm(forms.ModelForm):

    class Meta:

        model = models.Author

        fields = [‘name‘, ‘title‘, ‘birth_date‘]

class BookForm(forms.ModelForm):

    class Meta:

        model = models.Book

        fields = [‘name‘, ‘authors‘]

#上面的ModelForm子类基本等同于下面的定义方式(唯一的区别是save()方法):

from django import forms

class AuthorForm(forms.Form):

    name = forms.CharField(max_length=100)

    title = forms.CharField(

        max_length=3,

        widget=forms.Select(choices=TITLE_CHOICES),

    )

    birth_date = forms.DateField(required=False)

class BookForm(forms.Form):

    name = forms.CharField(max_length=100)

    authors = forms.ModelMultipleChoiceField(queryset=Author.objects.all())

四、ModelForm的验证

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

def menu_add(request):

    if request.method == ‘POST‘:

        form = MenuModelForm(data=request.POST)

        if form.is_valid():

            form.save()

            return redirect(memory_reverse(request, ‘rbac:menu_list‘))

    form = MenuModelForm()

    return render(request, ‘rbac/change.html‘, {‘form‘: form})

def menu_edit(request, pk):

    obj = models.Menu.objects.filter(id=pk).first()

    if not obj:

        return HttpResponse(‘菜单不存在‘)

    if request.method == ‘POST‘:

        form = MenuModelForm(instance=obj, data=request.POST)

        if form.is_valid():

            form.save()

            return redirect(memory_reverse(request, ‘rbac:menu_list‘))

    form = MenuModelForm(instance=obj)

    return render(request, ‘rbac/change.html‘, {‘form‘: form})

原文地址:https://www.cnblogs.com/bubu99/p/10347432.html

时间: 2024-10-19 01:56:00

Django组件-ModelForm的相关文章

Django之ModelForm组件

1.Django之ModelForm组件 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示信息 help_texts=None, # 帮助提示信息 widgets=None, # 自定义插件 error_messages=None, # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIE

Django(十四)课程机构列表页数据展示,Django的modelform,关于urls的重新分发

关于urls的重新分发: 如果所有url都配置在根路径的urls.py里,会特别多,而且也不易于修改,Django框架里支持urls的重新分发: 1.在根路径的urls配置上: PS:namespace是定义命名空间,比如下面这种配置, urlpatterns = [ #课程机构url配置,验证码,每个app可以书写自己的url,然后通过include进来 url(r'^org/', include('oraganization.urls',namespace="org")), ] 2

Django的ModelForm简单用法

Django中内置了Form和Model两个类,有时候页面的表单form类与Model类是一一对应,因此分别定义Form类和Model类会比较麻烦,最简单的方式就是通过Model来生成一个Form类,Django内置的ModelForm就是为此而生的.下面以一个简单的例子来说明它的简单用法. 基本需求 收集用户的日本报名信息 其中JLPT的日语等级分为N1,N2,N3,N4,N5:所以需要一个选择器. 用户需要手动输入姓名,因此需要一个输入框. 在Project中新建一个app $ python

Django的ModelForm

基于django.forms.ModelForm:与模型类绑定的Form 先定义一个ModelForm类,继承ModelForm类 from django.forms import ModelForm class MyModelForm(ModelForm): class Meta: model=models.UserInfo fields="__all__" 修改视图函数reg def reg(request): if request.method=="POST"

Django组件-cookie,session

昨日内容回顾: json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() 反序列化方法:JSON.parse() ajax $.ajax({ url:"", type:"", data:{}, // 默认contentType="urlencoded" success:function(data){ } }) 一.Djang

Django组件——cookie与session

Django组件--cookie与session 一.会话跟踪技术 1.什么是会话跟踪技术 先了解一下什么是会话.可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打电话,你就是客户端,而10086服务人员就是服务器,从双方接通电话那一刻起,会话就开始了,到某一方挂断电话就表示会话结束.在通话过程中,你会向10086发出多个请求,这多个请求都在一个会话中. 在JavaWeb在,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览

Django的ModelForm组件

创建类 from django.forms import ModelForm from django.forms import widgets as wd from app01 import models class 类名(ModelForm): class Meta: model = models.表名 #models中的表名 fields="__all__", # 字段 exclude=None, # 排除字段 widgets=None, # 自定义插件 error_message

原生Form 和 Form组件 Modelform

主要的文件:manage.py,url.py,views.py,settings.py,models.py manage.py:项目管理文件,一般不做修改. url.py:路由系统,配置views.py中函数和对应路径的关系. views.py:添加视图函数,常见的增删查改函数. settings.py:模板配置文件,对TEMPLATES .DATABASES.STATIC_URL 等进行配置. models.py:数据库相关表的类描述. Django基础必备三件套:HttpResponse,

Django之modelform

在django中内置了form类和model类,当页面中的form值和model字段值完全一样时,此时可以通过model生成一个完全一样的form,Django中的modelForm就因此而生. 目标: 定义Author表,通过modelform提交数据到数据库 创建工程及app python django-admin.py startproject formstudy cd formstudy python manager.py startapp study 编辑models.py from