Django form表单

作者 夜狼荼 2019年01月29日 06:03 阅读 2004

Form

forms.py
from django import forms

class UserForm(forms.Form):
    username = forms.CharField(label='用户名', max_length=128)
    password = forms.CharField(label='密码', max_length=256, widget=forms.PasswordInput)
views.py
class LoginView(View):

    def get(self, request):
		# 需要先实例化个我还form表单
        login_form = UserForm(request.POST)
        return render(request, 'login.html', locals())

    def post(self, request):
        login_form = UserForm(request.POST)
        message = "请检查填写的内容!"

        if login_form.is_valid():
            username = request.POST.get('username')
            password = request.POST.get('password')
            try:
                user = User.objects.get(name=username)
                if user.password == password:
                    return redirect('index')
                else:
                    message = "密码不正确!"
            except:
                message = "用户名不存在!"
        return render(request, 'login.html', locals())
html页面引用方法
{{ login_form }}
手动渲染表单字段

直接{{ login_form }}虽然好,啥都不用操心,但是界面真的很丑,往往并不是你想要的,如果你要使用CSS和JS,比如你要引入Bootstarps框架,这些都需要对表单内的input元素进行额外控制,那怎么办呢?手动渲染字段就可以了。

可以通过{ login_form.name_of_field }}获取每一个字段,然后分别渲染,如下例所示:

<div class="form-group">
  {{ login_form.username.label_tag }}
  {{ login_form.username}}
  </div>
<div class="form-group">
  {{ login_form.password.label_tag }}
  {{ login_form.password }}
  </div>

其中的label标签可以用label_tag方法来生成。这样子更加灵活了,但是灵活的代价就是我们要写更多的代码,又偏向原生的HTML代码多了一点。

但是问题又...又...又来了!仔细查看最终生成的页面源码,你会发现,input元素里少了一个CSS的类form-control。这可咋办?

在form类里添加attr属性即可,如下所示:

from django import forms

class UserForm(forms.Form):
    username = forms.CharField(label="用户名", max_length=128, widget=forms.TextInput(attrs={'class': 'form-control'}))
    password = forms.CharField(label="密码", max_length=256, widget=forms.PasswordInput(attrs={'class': 'form-control'}))

ModelForm

整合model模型和forms表单

给出一个简单的例子:

# login/forms.py

from django import forms
from . import models

class UserForm(forms.ModelForm):
    class Meta:
        model = models.User
        fields = ['name', 'password']

    def __init__(self, *args, **kwargs):
        super(UserForm, self).__init__(*args, *kwargs)
        self.fields['name'].label = '用户名'
        self.fields['password'].label = '密码'

要注意,用户名字段由‘username’变成了‘name’,这是model决定的。

发表评论