公司动态

【2014-08-21】Django自学笔记:forms

📅 2026/9/1 15:31:43
【2014-08-21】Django自学笔记:forms
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2014-08-21 标题Django自学笔记forms分类编程 / web / Django 标签django·forms·get·postDjango自学笔记forms备注formsGet:POST备注最近自学了下Django这里笔记下学习记录。备注1 学习记录中的代码和资料参考自网络教程【 http://djangobook.py3k.cn/2.0/ 】和【 http://www.djangobook.com/en/2.0/ 】版权归原作者所有。2 小弟第一次接触到Django本笔记可能有错误还请各位路过的大牛们给予指点。3 由于教程年代比较久远了而且Django不同版本改动很大这里作者的学习笔记是基于【python2.7.8 django1.6.5】实现的。4 由于时间关系学习记录里有的地方记得比较乱以后有时间再整理下吧。forms这里简单的笔记下如何使用form来get/post数据到django。首先我们先看下Request的一些信息HttpRequest对象包含当前请求URL的一些信息另外request.META 是一个Python字典包含了所有本次HTTP请求的Header信息比如用户IP地址和用户Agent通常是浏览器的名称和版本号。 注意Header信息的完整列表取决于用户所发送的Header信息和服务器端设置的Header信息。因为 request.META 是一个普通的Python字典因此当你试图访问一个不存在的键时会触发一个KeyError异常。 HTTP header信息是由用户的浏览器所提交的、不应该给予信任的“额外”数据因此你总是应该好好设计你的应用以便当一个特定的Header数据不存在时给出一个优雅的回应。你应该用 try/except 语句或者用Python字典的 get() 方法来处理这些“可能不存在的键”这里我们写代码来查看一下先在urls.py中新加入一个网址路由url(r^showrequest/$,showrequest),然后在MyViewControllers.py中新加入一个函数defshowrequest(request):resh1Hello Request/h1;resrequest.path: %sbr%(request.path);resrequest.get_host(): %sbr%(request.get_host());resrequest.get_full_path(): %sbr%(request.get_full_path());resrequest.is_secure(): %sbr%(request.is_secure());resbr;try:valrequest.META[HTTP_USER_AGENT];exceptKeyError:valunknown;resrequest.META[HTTP_USER_AGENT]: %sbr%(val);try:valrequest.META[REMOTE_ADDR];exceptKeyError:valunknown;resrequest.META[REMOTE_ADDR]: %sbr%(val);resrequest.META[REFERRER]: %sbr%(request.META.get(REFERRER,unknown));resbr;fork,vinrequest.META.items():resrequest.META[%s]: %sbr%(k,v);returnHttpResponse(res);然后访问网址http://127.0.0.1:8000/showrequest/就可以得到如下结果如图也可以参考这个网址http://www.oschina.net/code/snippet_116018_12444Get:首先构造一个页面用来提交GET数据这里为了简单我们把页面写成模板格式直接渲染出来。我们首先新建一个模板search_form.html内容如下htmlheadtitleSearch/title/headbodyformaction/search/methodgetinputtypetextnameqinputtypesubmitvalueSearch/form/body/html如下图所示然后我们修改下MyViewControllers.py增加函数fromdjango.shortcutsimportrender;defsearch_form(request):returnrender(request,search_form.html);修改urls.py,增加网址路由url(r^search_form/$,search_form),搞定之后我们就可以访问网址http://127.0.0.1:8000/search_form/如下:我们简单的分析下searc****h_form.HTML代码可以发现当点击search按钮时会提交GET信息到**/search/**页面同时会提交Get信息”qxxx”这里我们实现下search页面。首先在MyViewControllers.py中添加函数defsearch(request):ifqinrequest.GET:messageYou searched for: %s%request.GET[q];else:messageYou submitted an empty form.;returnHttpResponse(message);然后在urls.py中注册一下url(r^search/$,search),我们随便输入一些字符点击Search按钮如下图为了测试下GET我们也可以遍历下Get数据修改MyViewControllers.py中的search函数如下defsearch(request):ifqinrequest.GET:messageYou searched for: %s%request.GET[q];else:messageYou submitted an empty form.;messagebr;fork,vinrequest.GET.items():messagerequest.GET[%s]: %sbr%(k,v);returnHttpResponse(message);然后我们自定义一些Get数据比如访问网址http://127.0.0.1:8000/search/?q11num22straabb‘cc’会有如下输出:POST同GET差不多我们新建一个意见反馈页面来模拟一个POST请求。首先我们新建一个html模板文件contact_form.html内容为htmlheadtitleContact us/title/headbodyh1Contact us/h1formaction/contact/methodpost{% csrf_token %}pSubject:inputtypetextnamesubject/ppYour e-mail:inputtypetextnameemail/ppMessage:textareanamemessagerows10cols50/textarea/pinputtypesubmitvalueSubmit/form/body/html注意里面有个**{% csrf_token %}**如下图所示然后我们增加代码来支持对它的访问代码如下在MyViewControllers.py中增加渲染函数fromdjango.templateimportRequestContext;defcontact_form(request):returnrender(request,contact_form.html,context_instanceRequestContext(request));在urls.py中增加路由函数url(r^contact_form/$,contact_form),然后我们就可以访问网址http://127.0.0.1:8000/contact_form/如下图根据contact_form.html文件当点击submit时会POST数据到路径/contact/下这里我们实现下这个网络响应在MyViewControllers.py中增加函数defcontact(request):message;fork,vinrequest.POST.items():messagerequest.POST[%s]: %sbr%(k,v);returnHttpResponse(message);在urls.py中增加路由函数url(r^contact/$,contact);然后我们就可以输入测试字符串然后submit如下图可以看到POST的数据已经取到了。但是这里我们刷新下页面会出现根据WEB开发的最佳实践应每次都给成功的POST请求做重定向防止重复提交因此这里我们简单的改下代码修改MyViewControllers.pyfromdjango.httpimportHttpResponseRedirect;defcontact(request):#do nth ,just redirect~~returnHttpResponseRedirect(/thanks/);defthanks(request):returnHttpResponse(thanks for your message);在urls.py中增加路由函数url(r^thanks/$,thanks),再次刷新会重定向到新的页面如下图备注各种有意思的评注