Py学习  »  问与答

Django form表单的验证以及错误提示

happyou • 9 年前 • 6509 次点击  

我想用Django的form实现一个简单的用户注册功能,目前完成的界面如下:

网页注册

我想完善的功能是当用户输入内容有误时,点击注册之后会在相应字段后面出现一个错误提示,就像Segmentfault的登录一样,密码错误下面会有简单的提示,如下:

错误提示

我的部分代码如下,

forms.py

class SignupForm(forms.Form):
    username = forms.CahrField(
        label=_("username"),
        max_length=30,
    )

    email = forms.EmailField(label=_('email'),)
    password_1 = forms.CharField(
        label=_("password"),
        widget=forms.PasswordInput,
    )
    password_2 = forms.CharField(
        label=_("password_confirmed"),
        widget=forms.PasswordInput,
    )

    def clean_password_2(self):
        password_1 = self.cleaned_data.get("password_1")
        password_2 = self.cleaned_data.get("password_2")
        if password_1 and password_2 and password_1 != password_2:
            raise forms.ValidationError(_('password confirm failed'))
        return password_2

signup.html

<form method="post" action="{% url 'accounts:signup_post' %}">
    {% csrf_token %}
    <table>
    {% for field in form %}
        <tr>
            <td>{{ field.label_tag }}</td>
            <td>{{ field }}</td>
            <td>{{ field.errors }}</td>
        </tr>
    {% endfor %}
    </table>

    <input type='submit' id="submit" value={% trans "signup" %}>
    <a href="{% url 'accounts:login' %}">{% trans "Already have accounts?" %}</a>
</form>

views.py

def signup_post(request):
    if request.method == 'POST':
        signup_form = forms.SignupForm(request.POST)

        if signup_form.is_valid():
            signup_info = signup_form.cleaned_data
            username = signup_info['username']
            email = signup_info['email']
            password = signup_info['password_1']
            user = User.objects.create_user(
                username=username,
                email=email,
                password=password)
            user.save()
            # 重定向到首页(暂时没写)
        else:
            # 估计是这里的问题,但不知道怎么改正
            return redirect(reverse("accounts:signup"))

    else:
        signup_form = forms.SignupForm()

    return render(reverse("accounts:signup"), {'form': signup_form})

目前只是想简单验证两次输入密码是否一致,参考文档写了 clean_ 函数,但是没有成功。我猜测是views 中 signup_form.is_valid() 失败之后返回页面时需要带上form,但是不知道怎么做。

已经读了Django文档中Form部分的内容,但是仍旧找不到解决方法。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/894
 
6509 次点击  
文章 [ 6 ]  |  最新文章 9 年前
happyou
Reply   •   1 楼
happyou    9 年前

@liaozd 我也没实现呢。。

走遍北京的德福小猪-weibo
Reply   •   2 楼
走遍北京的德福小猪-weibo    9 年前

可以使用 django sso 来实现。

liaozd
Reply   •   3 楼
liaozd    9 年前

第三方账号登陆怎么做?

happyou
Reply   •   4 楼
happyou    9 年前

@爱情的枪 已经在stackoverflow上解决了,不过多谢哈

走遍北京的德福小猪-weibo
Reply   •   5 楼
走遍北京的德福小猪-weibo    9 年前

本站登陆可以采用 bootstrap来完善页面。第三方登陆,你可以搜一下django sso ,搜寻一下单点登录,国内的可以采用多说,友言,国外的右disqus。希望对你有帮助。

爱情的枪
Reply   •   6 楼
爱情的枪    9 年前
from django.http import HttpResponseRedirect
return HttpResponseRedirect(reverse("accounts:signup"))