草庐IT

注册功能页面的搭建

suncolor 2023-04-16 原文

思路分析

注册页面需要对用户提交的数据进行校验,并且需要对用户输入错误的地方进行提示!

所有我们需要使用forms组件搭建注册页面!

平时我们书写form是组件的时候是在views.py里面书写的,
但是为了接耦合,我们需要将forms组件都单独写在一个地方,需要用的时候导入就行!

例如,在项目文件夹下创建一个myforms文件夹,里面放各种forms组件文件:

	myforms文件夹
		regform.py
		loginform.py
		userform.py
		orderform.py

注册页面的效果图:

注册页面代码实现

1.编写注册页面的forms组件

from django import forms
from app01 import models


class RegisterForms(forms.Form):
    username = forms.CharField(label='用户名',max_length=8,min_length=3,error_messages={
        'required':'用户名不能为空',
        'max_length':'用户名最大8位',
        'min_length': '用户名最小8位',
    },
     widget= forms.widgets.TextInput(attrs={'class':'form-control'}),
   )

    password = forms.CharField(label='密码',max_length=8,min_length=3,error_messages={
        'required':'密码不能为空',
        'max_length':'密码最大8位',
        'min_length': '密码最小8位',
    },
     widget= forms.widgets.PasswordInput(attrs={'class':'form-control'}),
   )
    confirm_password = forms.CharField(label='确认密码', max_length=8, min_length=3, error_messages={
        'required': '确认密码不能为空',
        'max_length': '确认密码最大8位',
        'min_length': '确认密码最小8位',
    },
    widget=forms.widgets.PasswordInput(attrs={'class': 'form-control'}),
    )
    email = forms.EmailField(label='邮箱',error_messages={
        'required':'邮箱不能为空',
        'invalid':'邮箱格式不正确',
    },
    widget=forms.widgets.EmailInput(attrs={'class':'form-control'})
                            )

    # 钩子函数
    def clean_username(self):
        username = self.cleaned_data.get('username')
        is_exist = models.UserInfo.objects.filter(username=username)
        if is_exist:
            self.add_error('username','该用户名已存在')
        return username

    def clean(self):
        password = self.cleaned_data.get('password')
        confirm_password = self.cleaned_data.get('confirm_password')
        if password != confirm_password:
            self.add_error('confirm_password','两次密码不一致')
        return self.cleaned_data

2.将注册页面的forms组件传入views.py里,然后渲染到前端页面

from app01.myforms import RegisterForms
def register(request):
    form_obj = RegisterForms() # 生产一个空的form_obj对象,然后传入前端就可以渲染出html页面
    return render(request,'register.html',locals())

3.forms组件在前端渲染的第三种方式

<div class="container">
    <div class="row">
        <div class="col-md-8 col-md-offset-2">
            <h3 class="text-center">注册</h3>
            <form id="myform">  <!--注意这里不用form表单提交数据,用form标签只是为了后面的序列化表单分便取出数据-->
            {% csrf_token %}
                {% for form in form_obj %}
                    <div class="form-group">
					
                        <label for="{{ form.auto_id }}">{{ form.label }}:</label>
                        {{ form }}
                        <span style="color: red">{{ form.error.0 }}</span>
                    </div>
                {% endfor %}
                <div class="form-group">
                    <label for="myfile">头像: &nbsp;<img src="/static/img/default.png" alt="" width="100px">
                    </label>
                    <input type="file" id="myfile" style="display: none">
                </div>
                <input type="button" class="btn btn-primary pull-right" value="提交" id="id_commit">
            </form>
        </div>
    </div>
</div>

4.用户头像动态展示:用到的是一个图片阅读器对象

    // 用户头像动态展示:给头像文件框绑定一个文本域变化事件,当文本域变化时动态展示图片
    $('#myfile').change(function (){
        // 1.先生成一个文件阅读器对象,用于读取头像和存储头像
        let fileReaderObj = new FileReader();
        // 2.获取头像对象
        let fileObj = $('#myfile')[0].files[0];
        // 3.利用文件阅读器对象读取头像
        // 注意:这一步是异步操作,也是IO操作,意味着我还没有读取完毕就往下执行了,所以fileReaderObj.result没有任何结果,因此需要使用预加载,等第3步执行完毕在执行第4步
        fileReaderObj.readAsDataURL(fileObj);
        // 4.利用文件阅读器对象将头像展示到前端页面  即:修改img标签里的src属性
        fileReaderObj.onload = function (){
            $('#myimg').attr('src',fileReaderObj.result)
        };
    })

5.向后端提交用户数据:用到了表单序列化方法取到用户数据和jquery查找方法,得到对应input的id值渲染文本和样式

    // 向后端提交用户数据
    $('#id_commit').click(function (){
        let formData = new FormData();
        let formDataObj = $('#myform').serializeArray();
        $.each(formDataObj,function (index,obj){
            formData.append(obj.name,obj.value)
        });
        formData.append('file',$('#myfile')[0].files[0]);
        $.ajax({
            type:'post',
            url:'',
            data:formData,
            contentType:false,
            processData:false,
            success:function (args){
                if (args.code==1000){
                    window.location.href = args.url
                }else{
                    // 找到对应span标签,渲染上错误信息
                    // 先来看下错误信息的格式和对应input标签的id
                    $.each(args.msg,function (index,obj){
                        // index是对应的字段名,obj是对应的错误信息列表
                        // 得到目标的input的id值
                        let targetID = '#id_' + index;
                        $(targetID).next().text(obj[0]).parent().addClass('has-error')
                    })
                }
            }
        })
    })

6.聚焦事件:当鼠标聚焦到对应input框时,取消对应标签的文本和样式

    // 当鼠标聚焦到input框时,取消input的has-error样式和错误提示文本
    $('input').focus(function (){
        $(this).next().text('').parent().removeClass('has-error')
    })

有关注册功能页面的搭建的更多相关文章

  1. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  2. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

  3. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  4. ruby - 在 ASP 页面上 Mechanize 中断 - 2

    require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie

  5. ruby-on-rails - prawnto 显示新页面时不会中断的表格 - 2

    我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.

  6. ruby-on-rails - rails 功能测试 - 2

    在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建

  7. ruby - 每个页面上的 Jekyll 分页 - 2

    据我们所知,Jekyll默认分页仅支持index.html,我想创建blog.html并在那里包含分页。有什么解决办法吗? 最佳答案 如果您创建一个名为/blog的目录并在其中放置一个index.html文件,那么您可以向_config.yml表示paginate_path:"blog/page:num"。不是使用根文件夹中的默认index.html作为分页器模板,而是使用/blog/index.html。分页器将根据需要生成类似/blog/page2/和/blog/page3/的页面。这将使您到达yourwebsite.com/b

  8. ruby-on-rails - 功能测试 Authlogic? - 2

    在我的一些Controller中,我有一个before_filter检查用户是否登录?用于CRUD操作。application.rbdeflogged_in?unlesscurrent_userredirect_toroot_pathendendprivatedefcurrent_user_sessionreturn@current_user_sessionifdefined?(@current_user_session)@current_user_session=UserSession.findenddefcurrent_userreturn@current_userifdefine

  9. ruby-on-rails - RoR && "coming soon"页面 - 2

    我正在寻找一种简单的方法来为我在RubyonRails上的项目实现简单的“即将推出”(预启动)页面。用户应该能够留下电子邮件以便在项目启动时收到通知。有没有这样的插件\gem?或者我应该自己做... 最佳答案 LaunchingSoon是一个Rails插件。它还集成了MailChimp或Campaignmonitor. 关于ruby-on-rails-RoR&&"comingsoon"页面,我们在StackOverflow上找到一个类似的问题: https:/

  10. ruby - 如何让 GitHub 页面使用 master 分支? - 2

    我有一个使用Jekyll托管在GitHub上的静态网站。问题是,我真的不需要master分支,因为存储库唯一包含的是网站。这样我就必须gitcheckoutgh-pages,然后gitmergemaster,然后gitpushorigingh-pages。有什么简单的方法可以摆脱gh-pages分支并直接从master推送? 最佳答案 Theproblemis,Idon'treallyneedthemasterbranch,astheonlythingtherepositorycontainsisthewebsite.Isthere

随机推荐