form与modeform

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())
原文地址:https://www.cnblogs.com/huanghongzheng/p/11295391.html