form
模型表的增删改查
form组件
1.校验数据
2.渲染标签
3.展示信息
modelform用法
from django.forms import ModelForm
from django.forms import widgets as wid
class ModelFormClass(ModelForm):
class Meta:
model =Student #对应的Model中的类
fields = "__all__" #字段,如果是__all__,就是表示列出所有的字段
exclude = None #排除的字段
#error_messages用法:
error_messages = {
'name':{'required':"用户名不能为空",},
'age':{'required':"年龄不能为空",},
}
#widgets用法,比如把输入用户名的input框给为Textarea
#首先得导入模块
from django.forms import widgets as wid #因为重名,所以起个别名
widgets = {
"name":wid.Textarea(attrs={"class":"c1"}) #还可以自定义属性
}
#labels,自定义在前端显示的名字
labels= {
"name":"用户名"
}
return ModelFormClass
方法一
from django.forms import ModelForm
class BookForm(ModelForm):
class Meta:
model = models.Book # 指定你要操作的模型表
fields = '__all__' # __all__渲染出所有字段
# fields = ['title'] # 可以指定展示的字段
def clean_title(self):
title = self.cleaned_data.get('title')
if title == '666':
self.add_error('title','光喊666是不行滴')
else:
return title
def add_form(request):
form_obj = BookForm()
if request.method == 'POST':
form_obj = BookForm(request.POST)
if form_obj.is_valid():
form_obj.save()
return redirect('/list')
return render(request,'add_form.html',locals())
def edit_form(request,id):
edit_obj = models.Book.objects.filter(pk=id).first()
form_obj = BookForm(instance=edit_obj)
if request.method == 'POST':
form_obj = BookForm(request.POST,instance=edit_obj)
if form_obj.is_valid():
form_obj.save()
return redirect('/list')
return render(request,'edit_form.html',locals())
方法二
app中
# 先在def __init__():中定义model_form_class = None
class BookConfig(ModelStark):
list_display = ['title','price','publishDate','publish']
list_display_links = ['title']
from django.forms import ModelForm
class BookModelForm(ModelForm): #自己方法中配置了modeform方法
class Meta:
model = models.Book
fields = '__all__'
from django.forms import widgets as wid
widgets = {
'title':wid.TextInput(attrs={'class':'form-control'}),
'price':wid.TextInput(attrs={'class':'form-control'}),
'publishDate':wid.DateInput(attrs={'class':'form-control'}),
'publish':wid.Select(attrs={'class':'form-control'}),
'authors':wid.SelectMultiple(attrs={'class':'form-control'}),
}
model_form_class = BookModelForm
site.register(models.Book,BookConfig)
admin中
def get_model_form(self):
if self.model_form_class: #如果自己方法中配置了modeform方法旧使用自己的,没有配置使用默认的
return self.model_form_class
from django.forms import ModelForm
from django.forms import widgets as wid
class ModelFormClass(ModelForm):
class Meta:
model = self.model
fields = "__all__"
return ModelFormClass
def add_view(self,request):
model_form_class = self.get_model_form()
model_form_obj = model_form_class()
if request.method == 'POST':
model_form_obj = self.model_form_class(request.POST)
if model_form_obj.is_valid():
model_form_obj.save()
return redirect(self.get_reverse_url('list'))
return render(request,'stark/add_view.html',locals())
def edit_view(self,request,id):
edit_obj = self.model.objects.filter(pk=id).first()
model_form_class = self.get_model_form()
model_form_obj = model_form_class(instance=edit_obj) #instabce用于区别是增加还是编辑
if request.method == 'POST':
model_form_obj = model_form_class(request.POST,instance=edit_obj)
if model_form_obj.is_valid():
model_form_obj.save()
return redirect(self.get_reverse_url('list'))
return render(request,'stark/edit.html',locals())