django1.8forms读书笔记

一、HttpRequest对象的一些属性或方法

  • request.path,The full path, not including the domain but including the leading slash,例如:"/hello/"
  • request.get_host(),The host (i.e., the “domain,” in common parlance).例如:"127.0.0.1:8000" or"www.example.com"
  • request.get_full_path(),The path, plus a query string (if available),例如:"/hello/?print=true"
  • request.is_secure(),True if the request was made via HTTPS. Otherwise, False。例如:True or False

关于请求的其他信息request.META是一个字典,包含了所有HTTP头部信息,一些常见的keys如下:

  • HTTP_REFERER – The referring URL, if any. (Note the misspelling of REFERER.)
  • HTTP_USER_AGENT – The user’s browser’s user-agent string, if any. This looks something like:"Mozilla/5.0 (X11; U; Linux i686; fr-FR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17".
  • REMOTE_ADDR – The IP address of the client, e.g., "12.345.67.89". (If the request has passed through any proxies, then this might be a comma-separated list of IP addresses, e.g., "12.345.67.89,23.456.78.90".)

注意:当不知道字典中是否含有一个键时,最好用get方法,因为META是一个字典,获取一个不存在的键会返回一个异常。例如:

ua = request.META.get(‘HTTP_USER_AGENT‘, ‘unknown‘)

2、根据学生ID搜索学生信息的简单例子:

models是

class StudentInfo(models.Model):

    name = models.CharField(max_length = 50,default="");
    studentID = models.CharField(max_length=12,default="");
    sex = models.CharField(max_length = 5,default="");
    age = models.IntegerField(default=0);
    address = models.TextField(default="");

template文件夹里存放template文件,searchBase.html文件如下:

<!DOCTYPE html>
<html>
<head>
    <title>
    {% block title %}{% endblock %}
    </title>
</head>

<body>
    <div>
    {% block search %}

    {% endblock %}
    </div>
    <hr/>
    <div>
    {% block footer %}
        <p>©2016&nbsp;Allen&nbsp;</p>
    {% endblock %}
    </div>
</body>
</html>

searchStudentInfo.html文件内容如下:

 1 {% extends "searchBase.html" %}
 2
 3 {% block title %}get student infomation{% endblock %}
 4
 5 {% block search %}
 6 <h1 style="text-align:center;">根据ID搜索学生信息</h1>
 7 <div>
 8     <form action="/student/search/" method="post" style="text-align:center;">
 9         <input type="text" name="q">
10         <input type="submit" value="搜索">
11     </form>
12 </div>
13 {% endblock %}    

在视图文件中定义搜索id的视图,SearchForm函数

1 def SearchForm(request):
2     return render(request, "searchStudentInfo.html")

在urls文件中定义路由

url(r‘^searchform/$‘, views.SearchForm),

此时还不能正常工作,因为没有写搜索的响应函数。当然可以看一下效果

接下来为其添加响应函数,views.py

1 def SearchStudentInfo(request):
2     if ‘q‘ in  request.POST:
3         searchInfo = "you searched %s"%request.POST[‘q‘];
4     else:
5         searchInfo = "you submitted an empty form"
6     return HttpResponse(searchInfo);

添加路由

url(r‘^search/$‘, views.SearchStudentInfo),

此时可以正常工作。

3、将查询结果做成模版进行显示

创建显示结果模版searchResult.html代码如下:

 1 {% extends "searchBase.html"%}
 2
 3 {% block title %}search result{% endblock %}
 4
 5 {% block search %}
 6     <p>You searched for: <strong>{{ query }}</strong></p>
 7     {% if students %}
 8         <p>Found {{students|length}} students</p>
 9         <table>
10             <tr>
11                 <td>姓名</td>
12                 <td>学号</td>
13                 <td>性别</td>
14                 <td>年龄</td>
15                 <td>地址</td>
16             </tr>
17             {% for student in students %}
18             <tr>
19
20                 <td>{{ student.name }}</td>
21                 <td>{{ student.studentID }}</td>
22                 <td>{{ student.sex }}</td>
23                 <td>{{ student.age }}</td>
24                 <td>{{ student.address }}</td>
25
26             </tr>
27             {% endfor %}
28         </table>
29     {% else %}
30         <p>not found student where studentID = {{ query }}</p>
31     {% endif %}
32 {% endblock %}

修改视图函数views.py

 1 def SearchStudentInfo(request):
 2     if ‘q‘ in  request.GET and request.GET[‘q‘]:
 3         stu =  StudentInfo.objects.filter(studentID=request.GET[‘q‘])
 4         if stu:
 5             context = {‘query‘:request.GET[‘q‘],‘students‘:stu}
 6             return render(request, ‘searchResult.html‘, context)
 7         else:
 8             return HttpResponse("not found information");
 9
10     else:
11         searchInfo = "you submitted an empty form"
12     return HttpResponse(searchInfo);

此时可以运行一下查看结果,效果如下:

二、对这个表单进行改进

对网址http://127.0.0.1:8888/student/search/进行访问,有三种可能情况

  • 访问页面,此时没有‘q’参数在GET中
  • 点击提交按钮,‘q’在GET中,但是搜索框中没有搜索内容。
  • 点击提交按钮,‘q’在GET中,搜索框中有搜索内容。

对于第一种情况我们不应该显示出错误信息,第二种情况应该显示出错信息,第三种情况应当进入数据库进行查询。为了更专业一点,当没有输入数据提交时,应当返回上一个查询框,而不是返回一个字符串。

需要修改的地方有 1、视图函数  2、在搜索模版中加入判断的变量error

views.py

 1 def SearchStudentInfo(request):
 2     error = False;
 3     if ‘q‘ in  request.GET :
 4         if not request.GET[‘q‘]:
 5             error=True;
 6         else:
 7             stu =  StudentInfo.objects.filter(studentID=request.GET[‘q‘])
 8             context = {‘query‘:request.GET[‘q‘],‘students‘:stu}
 9             return render(request, ‘searchResult.html‘, context)
10
11     return render(request, ‘searchStudentInfo.html‘, {‘error‘:error});

searchStudentInfo.html

 1 {% extends "searchBase.html" %}
 2
 3 {% block title %}search student infomation{% endblock %}
 4
 5 {% block search %}
 6 <h1 style="text-align:center;">根据ID搜索学生信息</h1>
 7 <div>
 8     {% if error %}
 9         <p style="color: red;">Please submit a search term.</p>
10     {% endif %}
11     <form action="/student/search/" method="get" style="text-align:center;">
12         学号:<input type="text" name="q">
13         <input type="submit" value="搜索">
14     </form>
15 </div>
16 {% endblock %}

2、

<form action="" method="get">
当 action=""表示提交表单时,将向当前的url提交。

3、

时间: 2024-08-28 16:37:15

django1.8forms读书笔记的相关文章

django1.6读书笔记一

reporter是Article中的一个外键,我们可以有多篇文章指向同一个reporter,然后通过使用article_set.all()就可以返回其所有的headline了,也可以添加条件来筛选. (r’^articles/(\d{4})/(\d{2})/(\d+)/$’, ’news.views.article_detail’), /articles/2005/05/39323/的请求会变成news.views.article_detail(request, ’2005’, ’05’, ’3

django1.8读书笔记模型高级进阶

一.访问外键和多对多值 例如:模型类定义如下 from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30) address = models.CharField(max_length=50) city = models.CharField(max_length=60) state_province = models.CharField(max_length=30

《C#图解教程》读书笔记之三:方法

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.方法那些事儿 (1)方法的结构:方法头-指定方法的特征,方法体-可执行代码的语句序列: (2)方法的调用:参数.值参数.引用参数.输出参数.参数数组: ①参数: 形参-本地变量,声明在参数列表中:形参的值在代码开始之前被初始化: 实参-实参的值用于初始化形参: ②值参数: 为形参在栈上分配内存,将实参的值复制到形参: ③引用参数: 不为形参在栈上分配内存,形参的参数名作为实参变量的别名指向同一位置,必须使用ref关

《C#图解教程》读书笔记之五:委托和事件

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执行它所"持有"的方法.如果从C++的角度来理解委托,可以将其理解为一个类型安全的.面向对象的函数指针. (2)如何使用委托? ①声明委托类型(delegate关键字) ②使用该委托类型声明一个委托变量 ③为委托类型增加方法 ④调用委托执行方法 (3)委托的恒定性: 组合委托.为委托+=增加

《Effective C++》读书笔记汇总

我之前边读<Effective C++>边写下每个条款的读书笔记,这一版是C++11之前的版本.这里我将每个条款令我印象深刻的点小结一下. 1.C++包括:Plain C(面向过程).OOP(面向对象).模板(泛型和模板元编程).STL(C++标准库). 2.用inline.enum.const代替#define.#define定义的宏,一旦复杂起来,高手都很难掌控.不要带入C的习惯. 3.灵活使用const前缀.不需要进行改变的数据加上const前缀.指针的const前缀有两种形式,cons

【读书笔记】《Linux内核设计与实现》内核同步介绍&内核同步方法

简要做个笔记,以备忘. 需同步的原因是,我们并发访问了共享资源.我们将访问或操作共享资源的代码段称"临界区",如果两个执行线程处于同一临界区中同时执行,称"竞争条件".这里术语执行线程指任何正在执行的代码实例,如一个在内核执行的进程.一个中断处理程序或一个内核线程. 举个简单例子,i++操作.该操作可以转换为下面的机器指令序列: 1.得到当前变量i的值,并保存到一个寄存器. 2.将寄存器的值加1. 3.将i的新值写回到内存中. 当两个线程同时进入这个临界区,若i初值

鸟哥的Linux私房菜 基础学习篇读书笔记(7):Linux文件与目录管理

这一章主要讲述的是如何操作与管理Linux系统中的文件和目录,主要包括目录间的切换,目录的创建与删除,文件的创建与删除,文件的查找,文件内容的查看等等. 前一章中已经讲过相对路径以及绝对路径,绝对路径就是指从根目录("/")开始写起的路径名,而相对路径绝不会由根目录开始写起,相反,相对路径是相对于当前工作目录的路径名.Linux操作系统中有几个特殊的目录: . 代表此层目录: .. 代表上一层目录: - 代表前一个工作目录: ~ 代表当前用户身份所在的主文件夹: ~account 代表

《30天自制操作系统》读书笔记(2)hello, world

让系统跑起来 要写一个操作系统,我们首先要有一个储存系统的介质,原版书似乎是06年出版的,可惜那时候没有电脑,没想到作者用的还是软盘,现在的电脑谁有软驱?不得已我使用一张128M的SD卡来代替,而事实上你用的是U盘还是软盘对我们的操作系统没有影响,缺点是你的U盘刷入系统后容量只能是1440 MB,即当年流行的3.5英寸软盘的大小,当然不用担心,再格式化一次(用DiskGeniu),就可以恢复. 我做事情的话,总是怕自己的努力的结果白费了,害怕辛辛苦苦看完这本书但是发现做出来的东西现在根本没法用,

《巴菲特与索罗斯的投资习惯》读书笔记

巴菲特与索罗斯的投资习惯 收益与风险 收益越高风险越大,或者风险越大收益越高都是没有道理的,风险和收益逻辑上不一定是正相关的,只不过收益越高,人们愿意承担的风险越高而已. 降低风险的同时提高收益是不矛盾的.但风险控制应优先于收益. 同样的事情,对你来说是危险的,但对于高手来说则没有风险,因此,为了降低风险,尽力成为高手吧 关于投资 赚钱只是投资的目的而已,投资策略才是投资的手段. 只是将注意力集中在目的上是没有意义的,因为它只是你的手段所产生的自然结果. 因此我们需要把注意力几种在对投资策略的调