Django学习1.0

来源:互联网 发布:网络招商平台 编辑:程序博客网 时间:2024/06/10 07:16
模型:
由于 C 由框架自行处理,而 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django 也被称为 MTV 框架 
M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。
T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。
V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。
数据库配置也是在Django的配置文件里,缺省 是 settings.py 。


Django app包含:模型、视图、Django代码


创建app:
python manage.py startapp "app-name"


Django的模型能描述特定类型的数据字段比如Email地址、URL等等
比如创建:书籍/作者/出版商 数据库结构{一个作者有姓,有名及email地址。
                                      出版商有名称,地址,所在城市、省,国家,网站。
                                      书籍有书名和出版日期。 它有一个或多个作者(和作者是多对多的关联关系[many-to-many]), 只有一个出                                      版商(和出版商是一对多的关联关系[one-to-many],也被称作外键[foreign key])

在model.py中编辑原型:


from django.db import modelsclass 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)    country = models.CharField(max_length=50)    website = models.URLField()class Author(models.Model):    first_name = models.CharField(max_length=30)    last_name = models.CharField(max_length=40)    email = models.EmailField()class Book(models.Model):    title = models.CharField(max_length=100)    authors = models.ManyToManyField(Author)    publisher = models.ForeignKey(Publisher)    publication_date = models.DateField()




模型的安装:
在setting.py中激活模型。就是把刚才创建的app添加到INSTALLED_APPS中


验证模型有效性:python manage.py validat


生成create table语句:

python manage.py sqlall "app-name"

提交SQL语句至数据库:

python manage.py syndb

在创建数据库对象的时候,需要注意save的使用,例如:
>>> from books.models import Publisher>>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue',...     city='Berkeley', state_province='CA', country='U.S.A.',...     website='http://www.apress.com/')>>> p1.save()


这样p1才存储进数据库


__unicode__() 代表某一个对象实体


修改数据库数据的时候也需要调用save方法


查找:
     查找所有对象:Publisher.objects.all()
     可以使用`` filter()`` 方法对数据进行过滤
        精确查找:Publisher.objects.filter(name='Apress')
        模糊匹配:Publisher.objects.filter(name__contains="press")
     get()方法获得一个对象:Publisher.objects.get(name="Apress")
     一般查找的时候要考虑查找不到时的异常的捕捉{ try: except:}
对象排序:
      Publisher.objects.order_by("name")
对象删除:
      获取后删除: p = Publisher.objects.get(name="O'Reilly") p.delete()
 


------------------------------------------------------------------------------------------


Django站点管理:
激活管理界面:
1:修改setting文件(将'django.contrib.admin'加入setting的INSTALLED_APPS配置中 ;保证INSTALLED_APPS中包含'django.contrib.auth','django.contrib.contenttypes'和'django.contrib.sessions',Django的管理工具需要这3个包;确保MIDDLEWARE_CLASSES 包含'django.middleware.common.CommonMiddleware' 、'django.contrib.sessions.middleware.SessionMiddleware' 和'django.contrib.auth.middleware.AuthenticationMiddleware' 。)
        2:生成超级账户
        3:讲admin访问配置在URLcnf中


使用管理界面:
尝试数据库用户的增删查改


将Models加入到Admin中:
1:进入app目录下
2:创建admin.py(from django.contrib import admin;from mysite.books.models import Publisher, Author, Book;admin.site.register(Publisher);admin.site.register(Author);admin.site.register(Book))
3:刷新管理界面
管理界面修改:
可以实现页面信息的显示形式、选择框、排序条、导航条等
n对m关系的选择实现:filter_horizontal:
class BookAdmin(admin.ModelAdmin):    list_display = ('title', 'publisher', 'publication_date')    list_filter = ('publication_date',)    date_hierarchy = 'publication_date'    ordering = ('-publication_date',)    **filter_horizontal = ('authors',)**




用户、用户组、权限:
每个用户的三个标记:
活动标志,它用来控制用户是否已经激活。 如果一个用户帐号的这个标记是关闭状态,而用户又尝试用它登录时,即使密码正确,他也无法登录系统。


成员标志,它用来控制这个用户是否可以登录管理界面(即:这个用户是不是你们组织里的成员) 由于用户系统可以被用于控制公众        页面(即:非管理页面)的访问权限,这个标志可用来区分公众用户和管理用户。


超级用户标志,它赋予用户在管理界面中添加、修改和删除任何项目的权限。 如果一个用户帐号有这个标志,那么所有权限设置(即        使没有)都会被忽略。


------------------------------------------------------------------------------
表单:
1:从Request对象中获取数据
2:有关Request的其他信息
HTTP_REFERER,进站前链接网页
HTTP_USER_AGENT,用户浏览器的user-agent字符串
REMOTE_ADDR 客户端IP
3:数据提交:GET和POST方式

POST数据是来自HTML中的〈form〉标签提交的,而GET数据可能来自〈form〉提交也可能是URL中的查询字符串(the query string)。


当我们提交表单仅仅需要获取数据时就可以用GET; 而当我们提交表单时需要更改服务器数据的状态,或者说发送e-mail,或者其他不仅仅是获取并显示数据的时候就使用POST。

简单的验证:
关于JAVASCRIPT验证:
此验证是实现在浏览器端的数据的验证,不过即使在浏览器端验证了,在服务器端也要进行验证,因为有的JAVASCRIPT验证被禁止了
编写Contact表单:
这个表单包括用户提交的反馈信息,一个可选的e-mail回信地址。 当这个表单提交并且数据通过验证后,系统将自动发送一封包含题用户提交的信息的e-mail给站点工作人员。
contact_form.html:

<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>


contact()视图代码:


def contact(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})



Django的form库:
表单框架最主要的用法是,为每一个将要处理的HTML的`` <Form>`` 定义一个Form类。 在这个例子中,我们只有一个`` <Form>`` ,因此我们只需定义一个Form类。 这个类可以存在于任何地方,甚至直接写在`` views.py`` 文件里也行,但是社区的惯例是把Form类都放到一个文件中:forms.py。
form对象:第一件事是将自己显示成HTML,第二件事是校验数据(校验时:传入数据生成一个form实体,然后调用实体.is_valid(),就会显示数据的正确性)
在视图中使用Form对象:

# views.pyfrom django.shortcuts import render_to_responsefrom mysite.contact.forms import ContactFormdef 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()    return render_to_response('contact_form.html', {'form': form})



# contact_form.html

<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>


设置最大长度:提供max_length参数,选项min_length参数同样可用。
自定义校验规则:主要是用在一些自己需要检测的规则的书写,比如填写的反馈信息无效,那么如何判断无效呢?一种方法就是判断文字的长度,比如少于两个字就是无效:方法一般绑定在form类上,比如对message的测试:

from django import formsclass ContactForm(forms.Form):    subject = forms.CharField(max_length=100)    email = forms.EmailField(required=False)    message = forms.CharField(widget=forms.Textarea)    def clean_message(self):        message = self.cleaned_data['message']        num_words = len(message.split())        if num_words < 4:            raise forms.ValidationError("Not enough words!")        return message


这个方法会在默认校验逻辑执行之后被调用。

指定标签:
自定义字段的标签。 仅需使用label。例如:email = forms.EmailField(required=False,label='Your e-mail address')

第八章:高级视图和URL配置
使用多个视图前缀:
在实践中,如果你使用字符串技术,特别是当你的 URLconf 中没有一个公共前缀时,你最终可能混合视图。 然而,你仍然可以利用视图前缀的简便方式来减少重复。 只要增加多个 patterns() 对象,象这样:

from django.conf.urls.defaults import *urlpatterns = patterns('mysite.views',    (r'^hello/$', 'hello'),    (r'^time/$', 'current_datetime'),    (r'^time/plus/(\d{1,2})/$', 'hours_ahead'),)urlpatterns += patterns('weblog.views',    (r'^tag/(\w+)/$', 'tag'),)


使用缺省视图参数:

你可以给一个视图指定默认的参数。 这样,当没有给这个参数赋值的时候将会使用默认的值。
# urls.py
from django.conf.urls.defaults import *from mysite import viewsurlpatterns = patterns('',    (r'^blog/$', views.page),    (r'^blog/page(?P<num>\d+)/$', views.page),)



# views.py
def page(request, num='1'):    # Output the appropriate page of blog entries, according to num.    # ...



在这里,两个URL表达式都指向了同一个视图 views.page ,但是第一个表达式没有传递任何参数。 如果匹配到了第一个样式, page() 函数将会对参数 num 使用默认值 "1" ,如果第二个表达式匹配成功, page() 函数将使用正则表达式传递过来的num的值。
对于一系列的url具体相似结果时,对于特殊的可以先判断,这样就不会把url混搭到view中了。




0 0