文档章节

windows上Python开发--3.Django的基础知识

jackxu2015
 jackxu2015
发布于 2015/08/14 22:58
字数 1727
阅读 15
收藏 1

最近两天下了班,没事学习了django的开发,今天做个总结。其实大家可以从百度,google搜到一些django的入门视频,初步了解一下django的框架。学习一些基础的概念和知识。本篇主要是对自己这两天做的做个总结。

1.创建第一个views.py

  上一篇文章我们在windows上搭建好了django的开发环境并建立一个测试demo。

在settings.py的同级目录下新建views.py目录。并输入以下代码

from django.http import HttpResponse

def index(req):
    context="This is main page!!!"
    return HttpResponse(context)

在urls.py 安装如下更改

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'drophome.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^admin/', include(admin.site.urls)),
    url(r'^index/','drophome.view.index'),

这时在浏览器里打开127.0.0.1:8000/index 就可以看到我们第一个view啦。在django的开发中我们主要采用mvc的模式即Models,view和control。但是这里的views.py更像control。在urls.py中是通过指定的url的对应view的index的函数。在urls.py 中指定的url是采用python中的正规表达式的形式,方便扩展。

2.利用Templates模板来格式化显示

在创建一个view.py后我们是HttpResponse来直接输出字符串的,如果想要输出更多,更复杂的内容就会很麻烦,要在代码写一些无关的html的标签。为此django提供了templats模板的概念,如下是一个模板的样本

<html>
<head>
    <title></title>
</head>
<body>
  <h1>{{context}}</h1>
 <table>
     {% for k,v in items %}
      <tr>
          <td>
             {{k}}
          </td>
          <td>
            {{ v}}
          </td>
      </tr>
     {% endfor %}

 </table>
</body>
</html>

可以保存为index.html从文件结构上和标准的html文档没什么差别。但是多了{{context}},和{% for .. %} 的东西。

期中{{ xxxx }} 表示为template的变量,所以的变量都是用{{ }} 来比标示,{% for k,v in items %} 是嵌入式的python的语句。用{% xxx %} 可以嵌入式python的语句。支持for,if,等python语句。那如果在view中使用template中呢。 

from django.shortcuts import render_to_response
def display_meta(req):
    values=req.META.items()
    values.sort()
    return render_to_response("index.html",{"items":values},)

其实{{context}}我们没有给他传值,因此它不会显示,也不会报错。我们把从req获取的meta数据传给了items让他在index里面显示。

要使用template还要在settings里添加如下代码

TEMPLATE_DIRS=(os.path.join(BASE_DIR,"templates"),)

并在该项目的同级目录创建tempaltes的目录,存放index.html 模板文件。

3.Django的form的使用

在django中使用表单有两种方式:1.使用template用html定义form。2.使用django的forms类来创建模板。两种创建模板的方式都是简单方便。
首先使用template的方式创建form

<html>
<head>
    <title>Contact us</title>
</head>
<body>
    <h1>Contact us</h1>

    {% if errors %}
        <ul>
            {% for error in errors %}
            <li>{{ error }}</li>
            {% endfor %}
        </ul>
    {% endif %}

    <form action="/contact/" method="post">
        <p>Subject: <input type="text" name="subject"></p>
        <p>Your e-mail (optional): <input type="text" name="email"></p>
        <p>Message: <textarea name="message" rows="10" cols="50"></textarea></p>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

在以上的html的中用html的form标签做了一个form,我我们看看如果在view处理这个form。

def contact2(request):
    errors = []
    if request.method == 'POST':
        if not request.POST.get('subject', ''):
            errors.append('Enter a subject.')
        if not request.POST.get('message', ''):
            errors.append('Enter a message.')
        if request.POST.get('email') and '@' not in request.POST['email']:
            errors.append('Enter a valid e-mail address.')
        if not errors:
            # send_mail(
            #     request.POST['subject'],
            #     request.POST['message'],
            #     request.POST.get('email', 'noreply@example.com'),
            #     ['siteowner@example.com'],
            # )
            return HttpResponseRedirect('/contact/thanks/')
    return render_to_response('contact_form.html',
        {'errors': errors})

在view中可以直接通过request.POST.get('subject','')方式来获取form里面的value。

用Django的form类来创建表单,在django提供了form类,实现方式和model的类似。

from django import forms

class ContactForm (forms.Form):
    subject=forms.CharField(max_length=32)
    email = forms.EmailField(required=False)
    message = forms.CharField(widget=forms.Textarea)
    def clean_message(self):
        msg=self.cleaned_data['message']
        num_rows=len(msg.split())
        if num_rows<2:
              raise forms.ValidationError("Not enough words!")
        return msg

以上就是通过继承forms.Form 实现form。我们可以通过实现clean_filed 的形式针对每个字段做自定义校验。也可以设置每个字段的属性。例如

message = forms.CharField(widget=forms.Textarea)

在view中如果使用这个表单。

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            # send_mail(
            #     cd['subject'],
            #     cd['message'],
            #     cd.get('email', 'noreply@example.com'),
            #     ['siteowner@example.com'],
            # )
            return HttpResponseRedirect('/contact/thanks/')
    else:
        form = ContactForm( initial= {'subject':'I love this site'})

    return render_to_response('contact2.html', {'form': form})

也可以在view中初始化form。

看看template的html的展示时如何使用form

<html>
<head>
    <title>Contact us</title>
</head>
<body>
    <h1>Contact us</h1>

    {% if form.errors %}
        <p style="color: red;">
            Please correct the error{{ form.errors|pluralize }} below.
        </p>
    {% endif %}

    <form action="" method="post">
        <table>
            {{ form.as_table }}
        </table>
        <input type="submit" value="Submit">
    </form>
</body>
</html>


到此为止我们就了解了在django使用表单的方式。

4.在Django中建立models

  在django中提供建模的models类。我们可以通过继承该类既可以实现创建一个表。

对象-关系映射(OBJECT/RELATION MAPPING,简称ORM),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

 上面这段是引资百度百科,帮助我们理解这个模型。

from django.db import models
from django.contrib.auth.models import User
import django.forms as forms

# Create your models here.

class SBook (models.Model):
    auth= models.ForeignKey(User)
    account= models.CharField(max_length=256)
    passwd = models.CharField(max_length=32,)
    title  = models.CharField(max_length=256)
    icon   = models.CharField(max_length=128)
    url    = models.CharField(max_length=128)

    def __unicode__(self):
        return self.account

我们可以在terminal中对model可以做测试操作。此时可以使用Pycharm 自带的terminal即可。

1.创建SBook的instance。

n [4]: from django.contrib.auth.models import User
   

In [5]: user=User.objects.create(username="xcy2",password="123",email="xcy@123.com")

In [6]: User.objects.all()
Out[6]: [<User: xcy>, <User: xcy1>, <User: xcy4>, <User: xcy2>]


In [9]: sbook=SBook.objects.create(auth=user,account="xcy2011sky",passwd="xcy.123",title="baidu.com",)

In [10]: SBook.objects.all()
Out[10]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>]


我们要创建SBook的实例,必须先创建user的实例,因为SBook 以来user。也可以用以下的方式创建

In [11]: sbook=SBook(auth=user,account='alan',passwd='123',title='csdn')

In [12]: sbook.save()

In [13]: SBook.objects.all()
Out[13]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>, <SBook: alan>]


2.修改更新数据:

In [14]: sbook.title='google'

In [15]: sbook.save()

In [16]: SBook.objects.all()
Out[16]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>, <SBook: alan>]

In [17]: print sbook.title
google

3.删除一个sbook的。

Out[28]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>, <SBook: alan>]

In [29]: print sbook.account
alan

In [30]: sbook.delete()

In [31]: sbook.save()

In [34]: SBook.objects.all()
Out[34]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>]

4.查询获取结果

In [34]: SBook.objects.all()
Out[34]: [<SBook: xcy2011sky>, <SBook: xcy2011sk>, <SBook: abcde>, <SBook: xcy2011sky>]

In [35]: queryset=SBook.objects.all()

In [37]: for q in queryset :
   ....:     print q.account
   ....:     
xcy2011sky
xcy2011sk
abcde
xcy2011sky






版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
jackxu2015
粉丝 3
博文 58
码字总数 41324
作品 0
深圳
高级程序员
私信 提问
apache+mod_wsgi+django在windows下的部署

最近因为python升级到了2.7导致mod_python不能用,所以自己电脑上的apache一直启动不起来,趁着周末有时间,抓紧搞一下。 在网上搜了一下,发现modpython已经停止维护了,而替代他的是modws...

durban
2012/05/08
0
0
Python入门教程之安装MyEclipse插件和安装Python环境

http://dlwt.csdn.net/fd.php?i=858467711513251&s=27caceefbe77d6532f648bb5ae3bc048 这个是Python for MyEclipse的插件 http://dlsw.baidu.com/sw-search-sp/soft/6e/17016/python-3.3.5.......

小帅帅丶
2015/03/03
0
11
python新手必备学习路线图,收藏留用!

作者:magedu 来源:www.magedu.com 本人从事python工作已经有5年的历史了,最早大学里面接触python,毕业后开始从事python相关的工作,现在从事伪全栈开发:这里为什么说伪呢,因为我不光写...

Py爱好
07/26
0
0
十问Python,所有关于Python的疑问,由十年pythoner给你作答!

为什么要学习Python编程语言?哪些人适合学习Python? 先回答第一个被初学编程的朋友问到最多的问题,为什么要学习Python编程语言? 答:现在信息更新的非常快速,又迎来了大数据的时代, 各...

Python新世界
07/20
0
0
5个python爬虫教材,让小白也有爬虫可写,含视频教程!

认识爬虫   网络爬虫,如果互联网是一张蜘蛛网,网络爬虫既是一个在此网上爬行的蜘蛛,爬了多少路程即获取到多少数据。 python写爬虫的优势   其实以上功能很多语言和工具都能做,但是用...

柯西带你学编程
06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

错误: 找不到或无法加载主类

在IDEA的使用过程中,经常断掉服务或者重启服务,最近断掉服务重启时突然遇到了一个启动报错: 错误:找不到或无法加载主类 猜测:1,未能成功编译; 尝试:菜单---》Build---》Rebuild Pro...

安小乐
16分钟前
1
0
vue路由传参,刷新页面,引发的bug

最近遇到一个bug 通过vue路由跳转到页面, 然后接参控制(v-if ),成功显示 而刷新页面,显示失败。 苦苦地找了半天原因,打印参数发现正确,再打印下类型......,路由跳过来会保持传参时的...

hanbb
16分钟前
0
0
【58沈剑 架构师之路】InnoDB,select为啥会阻塞insert?

MySQL的InnoDB的细粒度行锁,是它最吸引人的特性之一。 但是,如《InnoDB,5项最佳实践》所述,如果查询没有命中索引,也将退化为表锁。 InnoDB的细粒度锁,是实现在索引记录上的。 一,Inn...

张锦飞
19分钟前
0
0
冒泡,选择和插入排序比较

/** * 冒泡排序,两层嵌套循环,内层局部比较后,找出最大或者最小数据并交换数据,使其局部有序,外层用于比较剩余元素,相较于选择排序,选择排序相当于是冒泡的一个优化版本(减少了交换...

strict_nerd
20分钟前
0
0
html内联(行内)元素、块级(块状)元素和行内块元素分类

HTML可以将元素分类方式分为内联(行内)元素、块级(块状)元素和行内块元素三种。 注:HTML是标签语言,那么既然是标签,就可以自己定义一些自己元素(如<wode>自定义的元素</wode>等),自...

NB-One
26分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部