注册页面需要对用户提交的数据进行校验,并且需要对用户输入错误的地方进行提示!
所有我们需要使用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">头像: <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')
})
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐
我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:
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
我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码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.
在Rails自动生成的功能测试(test/functional/products_controller_test.rb)中,我看到以下代码:classProductsControllerTest我的问题是:方法调用products()在哪里/如何定义?products(:one)到底是什么意思?看代码,大概意思是“创建一个产品”,但是它是如何工作的呢?注意我是Ruby/Rails的新手,如果这些是微不足道的问题,我深表歉意。 最佳答案 如果您查看test/fixtures文件夹,您会看到一个products.yml文件。这是在您创建
据我们所知,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
在我的一些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
我正在寻找一种简单的方法来为我在RubyonRails上的项目实现简单的“即将推出”(预启动)页面。用户应该能够留下电子邮件以便在项目启动时收到通知。有没有这样的插件\gem?或者我应该自己做... 最佳答案 LaunchingSoon是一个Rails插件。它还集成了MailChimp或Campaignmonitor. 关于ruby-on-rails-RoR&&"comingsoon"页面,我们在StackOverflow上找到一个类似的问题: https:/
我有一个使用Jekyll托管在GitHub上的静态网站。问题是,我真的不需要master分支,因为存储库唯一包含的是网站。这样我就必须gitcheckoutgh-pages,然后gitmergemaster,然后gitpushorigingh-pages。有什么简单的方法可以摆脱gh-pages分支并直接从master推送? 最佳答案 Theproblemis,Idon'treallyneedthemasterbranch,astheonlythingtherepositorycontainsisthewebsite.Isthere