社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  问与答

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

happyou • 10 年前 • 7237 次点击  

我想用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
 
7237 次点击  
文章 [ 6 ]  |  最新文章 10 年前
happyou
Reply   •   1 楼
happyou    10 年前

@liaozd 我也没实现呢。。

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

可以使用 django sso 来实现。

liaozd
Reply   •   3 楼
liaozd    10 年前

第三方账号登陆怎么做?

happyou
Reply   •   4 楼
happyou    10 年前

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

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

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

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