Django class-based view 深入

标签: django class based | 发表时间:2011-08-08 21:19 | 作者:(author unknown) Ken
出处:http://simple-is-better.com/

上一篇我们粗略介绍了Django中的class-based view基础知识, 本篇我们继续来看关于class-based view的高级应用.

我们继续沿用上篇中的model:

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)
    country = models.CharField(max_length=50)
    website = models.URLField()

    class Meta:
        ordering = ["-name"]

    def __unicode__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField('Author')
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

我们来看看如何对一个Book实例进行更新, 我们要做的只是在视图类中更新 :

from django.views.generic.edit import UpdateView
from models import Book
from forms import BookForm

class UpdateBook(UpdateView):
    form_class = BookForm
    model = Book
    template_name = 'updatebook.html'  #这里是你的模板文件名

但是, 我们很多时候并不是简单地对一个实例进行如上的更新, 可能有更复杂的要求, 比如想隐藏一些属性让用户更新时不可见, 甚至有些属性(比如用户)都是在针对当前登录用户进行操作的, 而不用手动选择哪个用户, 类似这样的操作应该如何实现呢? 我们不妨把Book Model修改一下:

from django.contrib.auth.models import User

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(User, related_name='Author')
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

我们把author改成User, 并使用ForeignKey关联. 下面将要实现针对当前登录用户增加一个Book实例, 重写AddBookForm如下:

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

from models import Book

class AddBookForm(forms.ModelForm):
    class Meta:
        model = Book
        exclude = ('author',)

    def __init__(self, user, *args, **kwargs):
        super(AddBookForm, self).__init__(*args, **kwargs)
        self.fields['author'].queryset = User.objects.get(username = user.username)

下面来看视图类:

from django.views.generic.edit import UpdateView
from models import Book
from forms import AddBookForm

class UpdateBook(UpdateView):
    form_class = AddBookForm
    model = Book
    template_name = 'updatebook.html'  #这里是你的模板文件名

    def get_object(self):
        return Snippet(author = self.request.user)
   
    def get_form(self, form_class):
        return self.form_class(self.request.user, **self.get_form_kwargs())

经过简单地变化, 我们就可以在不用选择author而使用当前登录用户替代来实现创建Book.

值得注意的是get_object这个方法, 它继承自SingleObjectMixin, 如果你需要更复杂的对单实例的操作, 只需在你的视图中按照你的逻辑重写这个方法就可以了! 是不是简化了不少呢? 其他的class-based view实现都和这个类似, 可以说Form类操作是Django类视图中的典型.

总结

根据以上的讨论, 我们可以得出一个结论: 任何视图操作都可以用类视图之间的聚合, 方法重写完成你想要的操作!(包括AJAX, 在Django官方文档中给出了一个简单的示例, 如果你有兴趣, 可以用它来做实验.) 但是有一点比较遗憾: 由于Django1.3刚刚发布不久, 还没有成熟的网站用到class-based view来实现全部的视图操作, 性能方面还有待考验. 后续的Django关于AJAX的应用下篇细说!

# 来源:AmaoZhao's Blog


在微博上关注: 新浪, 腾讯   投稿

最新招聘

更多>>

相关 [django class based] 推荐:

Django class-based view 基础

- Ken - python.cn(jobs, news)
自从Django在1.3中新增了class-based view以来,还没有仔细研究它,开始感觉这个东西是否有点多余. 因为Django已经有了Generic veiws了啊, 可是仔细看过class-based veiw之后, 这种想法打消了, 因为你完全可以用类方法实现你所有的视图, 而代码阅读起来却更容易!.

Django class-based view 深入

- Ken - python.cn(jobs, news)
上一篇我们粗略介绍了Django中的class-based view基础知识, 本篇我们继续来看关于class-based view的高级应用.. 我们继续沿用上篇中的model:. 我们来看看如何对一个Book实例进行更新, 我们要做的只是在视图类中更新 :.     template_name = 'updatebook.html'  #这里是你的模板文件名.

Django 子域的实现

- est - python.cn(jobs, news)
Django作为一个典型的MVC三层框架,有着自己一套full-stack的实现. 针对开发和运行效率而言,有人想用[SQLAlchemy]来替换Django的ORM;有人会吐槽Django的Template模板渲染系统,转而尝试[Jinjia2];但或许没有人对Django的URL处理机制不满. StackOverflow上说,面对愈发大型的系统,Django的URL Routing可能是唯一剩下的模块.

Nginx+uWSGI 部署 Django 应用

- Ken - python.cn(jobs, news)
常见的django webapp 部署方式采用FCGI 或 WSGI的方式部署,今天我这备忘下采用uWSGI的部署方式. 目前我这博客就是采用 Nginx + uWSGI + Python + Django 构建的,部署虽没有php那样扔到目录那么方便,但是并发和性能消耗还是非常不错的. 这里不想赘述关于FCGI, WSGI,uWSGI之间的比较,网上关于这样的对比测试也有很多,例如这里.

标签?ID?还是CLASS?

- - 前端观察
想谈一下几个基本的HTML问题,都是围绕着应该怎样使用HTML. 多用有语义的标签,少用div和span,避免使用没有class的div和span. 设想一下HTML的世界最初只有div和span这两个标签,其实网页依然可以写得出来. 更多标签的出现,其实是为了替代利用率高但不好书写的 
 和  来的.

Java的 class文件结构

- - Java - 编程语言 - ITeye博客
Java-class文件结构.        我们都知道我们现在写的源代码计算机是不认识的,我们需要根据指定的编译器进行编译-连接-执行,这样才是我们想要的结果,所以计算机只能认识0或者1 ,那么如何与操作系统或者机器指令无关的程序能执行,那么在操作系统以及机器指令之上的那就是虚拟机了,这样我们编写的代码不再是最终形成二进制本地指令代码,而是一种在操作系统和机器指令之上的虚拟机规定的文件格式.

GitHub - GruppoFilippetti/vertx-mqtt-broker: Vert.x based MQTT Broker

- -

知名Python Web框架Django被墙

- Haisheng HU - Solidot
xuby 写道 "今天发现,知名Python Web框架Django的官方网站被墙. 目前尚不清楚是迎八一暂时屏蔽,还是永久屏蔽. " 北京联通ISP可以访问Https版.

Dotcloud 架设 Django 的几个问题

- Ken - python.cn(jobs, news)
几个月前写过一篇《在Dotcloud上架设Django网站》的文章,有读者将自己遇到的问题留在评论里,也有通过Gtalk联系我进行讨论的同学,在大家的帮助下解决了不少问题,现一并整理在这此. 这里说的是服务器的404错误,Django返回的404错误会有详细的提示,不在讨论范围内. 服务器404错误通常——当然也有例外——是Dotcloud设置不当引起的.

合理的组织 django 的 settings 文件

- Ken - python.cn(jobs, news)
django在一个项目的目录结构划分方面缺乏必要的规范,因此不同人的项目组织形式也千奇百怪,而且也很难说谁的做法就比较好. 我根据自己的项目组织习惯,发布了一个项目dj-scaffold. 前些天在reddit上为我的项目dj-scaffold打了个“广告”(见:http://redd.it/kw5d4).