您的位置:首页 > 编程语言 > Go语言

Django 在线教育平台开发(七)ModelForm

2018-12-04 21:34 573 查看

ModelForm创建表单

[code]#models
class UserAsk(models.Model):
name = models.CharField(max_length=20, verbose_name=u"姓名")
mobile = models.CharField(max_length=11, verbose_name=u"手机")
course_name = models.CharField(max_length=50, verbose_name=u"课程名")
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间")

#forms
class UserAskForm(forms.ModelForm):
class Meta:
model = UserAsk
fields = ['name', 'mobile', 'course_name']

使用modelForm继承models建立Form,使得Form的创建变的十分简单,同时还可具有一些models才有的特性。

特性:

特性1

[code]#views
#直接将表单以models的方式存入数据库
user_ask = userask_form.save(commit=True)

特性2

[code]#forms.py
class UserAskForm(forms.ModelForm):
...

#通过添加clean_的方法,可以自定义is_valid()方法,从而增强表单数据有效性的判断
def clean_mobile(self):
"""
验证手机号码是否合法
"""
mobile = self.cleaned_data['mobile']
REGEX_MOBILE = "^1[358]\d{9}$|^147\d{8}$|^176\d{8}$"
p = re.compile(REGEX_MOBILE)
if p.match(mobile):
return mobile
else:
raise forms.ValidationError(u"手机号码非法", code="mobile_invalid")

mobile = self.cleaned_data['mobile']    将数据转换成字典型,获取key='mobile'的数据。

Url分发

[code]#urls
from django.conf.urls import url,include

urlpatterns = [
#课程机构url配置
url(r'^org/', include('organization.urls', namespace="org")),
]

#org.urls
from django.conf.urls import url
from .views import OrgView

urlpatterns = [
url(r'^list/$', OrgView.as_view(), name="org_list"),
]

通过多级的url配置,使得urls.py的内容变的更加简洁,清楚。

注意:在include()中设置namespace,可以防止重名的冲突!

在template中,设置相对路径时需要使用{% url  'org: list' %}

实现Ajax异步请求

在页面上进行表单提交时,不希望改变整个页面,只在某些字段上进行调整。

[code]#views
from django.http import HttpResponse

class AddUserAskView(View):
def post(self, request):
userask_form = UserAskForm(request.POST)
if userask_form.is_valid():
user_ask = userask_form.save(commit=True)
return HttpResponse('{"status":"success"}', content_type='application/json')
else:
return HttpResponse('{"status":"fail", "msg":"添加出错"}', content_type='application/json')

这里与上面的代码是承接的,Ajax实现异步请求的方法是,在进行表单验证时,只发送小部分命令信息。处理是在客户端的JS中进行的。

[code]#templates
<script>
$(function(){
$('#jsStayBtn').on('click', function(){
$.ajax({
cache: false,
type: "POST",
url:"{% url "org:add_ask" %}",
data:$('#jsStayForm').serialize(),
async: true,
success: function(data) {
if(data.status == 'success'){
$('#jsStayForm')[0].reset();
alert("提交成功")
}else if(data.status == 'fail'){
$('#jsCompanyTips').html(data.msg)
}
},
});
});
})

</script>

反向获取被外键表

[code]#views.py
all_courses = course_org.course_set.all()

#models
class Course(models.Model):
course_org = models.ForeignKey(CourseOrg, verbose_name=u"课程机构", null=True, blank=True)

调用方法为:'name'+_set  ,及上图中的  '.course_set' 方法

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐