class BookForm(forms.ModelForm): class Meta: model = models.Book fields = "__all__" labels = { "title": "書名", "price": "價格" } widgets = { "password": forms.widgets.PasswordInput(attrs={"class": "c1"}), }
model = models.Book # 對應的Model中的類 fields = "__all__" # 字段,若是是__all__,就是表示列出全部的字段 exclude = None # 排除的字段 labels = None # 提示信息 help_texts = None # 幫助提示信息 widgets = None # 自定義插件 error_messages = None # 自定義錯誤信息
from myapp.models import Book from myapp.forms import BookForm # 根據POST數據建立一個新的form對象 form_obj = BookForm(request.POST) # 建立書籍對象 new_ book = form_obj.save() # 基於一個書籍對象建立form對象 edit_obj = Book.objects.get(id=1) # 使用POST提交的數據更新書籍對象 form_obj = BookForm(request.POST, instance=edit_obj) form_obj.save()
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參數來提供表單中數據的初始值。
def menu_add(request): if request.method == 'GET': form = MenuModelForm() return render(request, 'rbac/change.html', {'form': form}) form = MenuModelForm(data=request.POST) if form.is_valid(): form.save() return redirect(memory_reverse(request, 'rbac:menu_list')) 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 == 'GET': form = MenuModelForm(instance=obj) return render(request, 'rbac/change.html', {'form': form}) form = MenuModelForm(instance=obj, data=request.POST) if form.is_valid(): form.save() return redirect(memory_reverse(request, 'rbac:menu_list')) return render(request, 'rbac/change.html', {'form': form})
#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())
生成的Form類中將具備和指定的模型字段對應的表單字段,順序爲fields屬性列表中指定的順序。html
每一個模型字段有一個對應的默認表單字段。好比,模型中的CharField表現成表單中的CharField。模型中的ManyToManyField字段會表現成MultipleChoiceField字段。下面是完整的映射列表:數據庫
ForeignKey被映射成爲表單類的django.forms.ModelChoiceField,它的選項是一個模型的QuerySet,也就是能夠選擇的對象的列表,可是隻能選擇一個。django
ManyToManyField被映射成爲表單類的django.forms.ModelMultipleChoiceField,它的選項也是一個模型的QuerySet,也就是能夠選擇的對象的列表,可是能夠同時選擇多個,多對多嘛。app
help_text
設置爲模型字段的help_text
。模型字段 | 表單字段 |
---|---|
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 |