ModelForm组件

网课笔记

创建modelform类

from django import forms
class MyModelForm(forms.ModelForm):
    class Meta:
        model = models.Book  #一个models/py文件中的类(也就是一张表)对应一个modelform
        # fields = ['title','']  #选择你需要验证的字段
        fields = '__all__'      #选择所有字段
        # exclude = ['title',]  #排除某些字段
        labels = {   #注意写法
            'title':'书名',
            'price':'价格',
        }
        error_messages = {  #定制错误信息
            'title':{
                'required':'不能为空',
                'max_length':'太长了',
            },
            ...
            
        }
        widgets = {  #字段定制插件
            'publishDate':forms.widgets.DateInput(attrs={'type':'date'}),
            # 'publishDate2':forms.widgets.DateInput(attrs={'type':'date'}),
        }
    
    def clean_title(self): #局部钩子
        val = self.cleaned_data.get('titile')
        return val
    def clean(self):pass 全局钩子
    
    #照样可以重写init方法来进行批量操作
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for field in self.fields:
            self.fields[field].widget.attrs.update({
                'class': 'form-control',
            })

使用modelform类

——视图函数中

def edit_book(request,n):
    book_obj = models.Book.objects.filter(pk=n)
    if request.method == 'GET':
        book_obj = book_obj.first()
        form = MyModelForm(instance=book_obj) #实例化modelform对象,其中参数是你要求改的那个model对象,如果不加instance=book_obj就只生成标签,没有数据
        
        return render(request,'edit_book.html',{'n':n,'form':form})

    else:
        data = request.POST
        form = MyModelForm(data,instance=book_obj.first()) #如果没有写instance=这个参数,那么save方法会翻译成create,添加一个新的~~实际上我们想update修改!所以得加instance=book_obj
        if form.is_valid():
            form.save()  #update--book_obj.update(**data)
            return redirect('show')
        else:
            return render(request,'edit_book.html',{'form':form,'n':n})

前端渲染

{% for field in form %}
    <div class="form-group {% if field.errors.0 %} has-error {% endif %}">
        <label for="{{ field.id_for_label }}"> {{ field.label }}</label>

        {{ field }}
        <span class="text-success">{{ field.help_text }}</span>
        <span class="text-danger">{{ field.errors.0 }}</span>
    </div>
{% endfor %}

 

posted on 2019-06-07 14:06  江湖乄夜雨  阅读(125)  评论(0编辑  收藏  举报