Django 学习日记 - Form- setp12

1 概念

django表单系统中,所有的表单类都作为django.forms.Form的子类创建,包括ModelForm关于django的表单系统,主要分两种:

  • 基于django.forms.Form: 所有表单类的父类
  • 基于django.forms.ModelForm: 可以和模型类绑定的Form

使用Django中的Form可以大大简化代码,常用的表单功能特性都整合到了Form中,而ModelForm可以和Model进行绑定,更进一步简化操作。

2 具体实例

# models.py
class Publisher(models.Model):
    name = models.CharField(max_length=30, verbose_name="出版社名称")
    address = models.CharField("地址", max_length=50)
    city = models.CharField("城市", max_length=60)
    state_province = models.CharField("省份", max_length=30)
    country = models.CharField("国家", max_length=50)
    website = models.URLField("网址", )

    class Meta:
        verbose_name = '出版社'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

2.1 不使用Django Form的情况

# url.py
urlpatterns = [
    url(r'^add_publisher/$', views.add_publisher, name="add_publisher"),
]

# view.py
def add_publisher(request):
    if request.method == "POST":
        print(request.POST['name'])
        Publisher.objects.create(
            name=request.POST['name'],
            address=request.POST['address'],
            city=request.POST['city'],
            state_province=request.POST['state_province'],
            country=request.POST['country'],
            website=request.POST['website'],
        )
        return HttpResponse("添加出版社信息成功")
    else:
        return render(request, 'add_publisher.html')



    
    添加出版商信息


添加出版商信息

{% csrf_token %} 名称:
地址:
城市:
省份:
国家:
网址:

2.2 使用Form的情况

# url.py
urlpatterns = [
    url(r'^add_publisher_django_form/$', views.add_publisher_django_form, name="add_publisher_django_form"),
]

# forms.py
class PublisherForm(forms.Form):
    name = forms.CharField(label="名称", error_messages={"required": "这个选项必须填写"})
    address = forms.CharField(label="地址", error_messages={"required": "这个选项必须填写"})
    city = forms.CharField(label="城市", error_messages={"required": "这个选项必须填写"})
    state_province = forms.CharField(label="省份", error_messages={"required": "这个选项必须填写"})
    country = forms.CharField(label="国家", error_messages={"required": "这个选项必须填写"})
    website = forms.URLField(label="网址", error_messages={"required": "这个选项必须填写"})

# view.py
def add_publisher_django_form(request):
    if request.method == "POST":
        publisher_form = PublisherForm(request.POST)
        if publisher_form.is_valid():
            Publisher.objects.create(
                name=publisher_form.cleaned_data['name'],
                address=publisher_form.cleaned_data['address'],
                city=publisher_form.cleaned_data['city'],
                state_province=publisher_form.cleaned_data['state_province'],
                country=publisher_form.cleaned_data['country'],
                website=publisher_form.cleaned_data['website'],
            )
            return HttpResponse("添加出版社信息成功")
    else:
        publisher_form = PublisherForm()
    return render(request, 'add_publisher_django_form.html', locals())



    
    添加出版商信息


添加出版商信息

{% csrf_token %} {{ publisher_form.as_p}}

2.3 使用ModelForm的情况

# url.py
urlpatterns = [

    url(r'^add_publisher_model_form/$', views.add_publisher_model_form, name="add_publisher_model_form"),
]

# forms.py
class PublisherModelForm(forms.ModelForm):
    class Meta:
        model = Publisher
        exclude = ("id",)

# view.py
def add_publisher_model_form(request):
    if request.method == "POST":
        publisher_form = PublisherModelForm(request.POST)
        if publisher_form.is_valid():
            publisher_form.save()
            return HttpResponse("添加出版社信息成功")
    else:
        publisher_form = PublisherModelForm()
    return render(request, 'add_publisher_model_form.html', locals())



    
    添加出版商信息


添加出版商信息

{% csrf_token %} {{ publisher_form.as_p}}

一、表单字段的验证器

二、clean_filedname,验证字段,针对某个字段进行验证

三、表单clean方法,可针对整个表单进行验证。

案例:
自定义验证,不能插入重名的出版社名称。

参考链接

你可能感兴趣的:(Django 学习日记 - Form- setp12)