Django 1.5.4 专题22 Signals
2013-10-19 12:20
459 查看
下列场景转自http://www.cnblogs.com/mindsbook/archive/2009/10/27/django_signal.html
一.修改userprofile/models.py的内容
pre_init是在model实例之前会触发, post_init是在model实例化之后触发。 pre_save是在保存之前触发, post_save是保存之后触发
二.创建app
三.修改approvals/models.py
四.修改approvals/signals.py
五.修改article/models.py
六.修改article/templates/articles.html
七.修改approvals/admin.py
八.使用south
在用户完成某个操作后, 自动去执行一些后续的操作. 譬如用户完成修改密码后, 你要发送一份确认邮件.
一.修改userprofile/models.py的内容
from django.db import models from django.contrib.auth.models import User from django.db.models.signals import post_save from django.dispatch import receiver import logging logr = logging.getLogger(__name__) class UserProfile(models.Model): user = models.OneToOneField(User) likes_cheese = models.BooleanField() favourite_hamster_name = models.CharField(max_length=50) User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0]) @receiver(post_save, sender=User) def make_sure_user_profile_is_added_on_user_created(sender, **kwargs): if kwargs.get('created', False): up = UserProfile.objects.create(user=kwargs.get('instance')) logr.debug("UserProfile created: %s" % up)
pre_init是在model实例之前会触发, post_init是在model实例化之后触发。 pre_save是在保存之前触发, post_save是保存之后触发
二.创建app
django-admin.py startapp approvals
三.修改approvals/models.py
from django.db import models from signals import article_approved import logging logr = logging.getLogger(__name__) class Approval(models.Model): approved = models.BooleanField(default=False) article_id = models.IntegerField() def save(self, **kwargs): if self.pk is not None and self.approved == True: rec = article_approved.send(self, article_id=self.article_id) logr.debug("Approval confirmed for article_id = %s" % self.article_id) super(Approval, self).save(kwargs)
四.修改approvals/signals.py
import django.dispatch article_approved = django.dispatch.Signal(providing_args=["article_id"])
五.修改article/models.py
import os import os.path from django.db import models from time import time from django.db.models import signals from django.conf import settings from django_test import settings from django.db.models.signals import post_save from django.dispatch import receiver from approvals.models import Approval from approvals.signals import article_approved import logging logr = logging.getLogger(__name__) def get_upload_file_name(instance, filename): return settings.UPLOAD_FILE_PATTERN % (str(time()).replace('.','_'), filename) # Create your models here. class Article(models.Model): title = models.CharField(max_length=200) body = models.TextField() pub_date = models.DateTimeField('date published') likes = models.IntegerField(default=0) thumbnail = models.FileField(upload_to=get_upload_file_name) approved = models.BooleanField(default=False) def __unicode__(self): return self.title def get_absolute_url(self): return "/articles/get/%i/" % self.id def get_thumbnail(self): thumb = str(self.thumbnail) if not settings.DEBUG: thumb = thumb.replace('assets/', '') return thumb @receiver(post_save, sender=Article) def create_approval_on_new_article(sender, **kwargs): if kwargs.get('created', False): approval = Approval.objects.create(article_id=kwargs.get('instance').id) logr.debug("Approval created: %s" % approval) @receiver(article_approved) def approve_article(sender, **kwargs): a = Article.objects.get(id=kwargs.get('article_id')) a.approved = True a.save() logr.debug("Approval recieved") class Comment(models.Model): first_name = models.CharField(max_length=200) second_name = models.CharField(max_length=200) body = models.TextField() pub_date = models.DateTimeField('date published') article = models.ForeignKey(Article)
六.修改article/templates/articles.html
{% extends "base.html" %} {% load article_tags %} {% block sidebar %} <ul> <li><a href="/articles/all">Articles</a></li> <li><a href="/articles/create">Create Article</a></li> </ul> <h3>Search</h3> {% csrf_token %} <input type="text" id="search" name="search" /> <ul id="search-results"> </ul> {% endblock %} {% block content %} <h2>Language is: {{language}}</h2> <h2>Session Language is: {{session_language}}</h2> {% if articles.count > 0 %} {% for article in articles %} {% if article.approved %} <div> <h2><a href="/articles/get/{{ article.id }}/">{{ article.title }}</a></h2> <p>{{ article.body|lower|article_shorten_body:50 }}</p> <p>{{article.likes}} people liked this article</a></p> </div> {% endif %} {% endfor %} {% else %} <p>None to show!</p> {% endif %} {% endblock %}
七.修改approvals/admin.py
from django.contrib import admin from approvals.models import Approval admin.site.register(Approval)
八.使用south
manage.py schemamigration approvals --initial manage.py schemamigration article --auto manage.py migrate
相关文章推荐
- Django 1.5.4 专题二 urls 和 view 提高
- Django 1.5.4 专题14 Basic unit testing
- Django 1.5.4 专题19 heroku s3
- Django 1.5.4 专题九 update database records
- Django 1.5.4 专题25 Notifications
- Django 1.5.4 专题28 键操作
- Django 1.5.4 专题一 入门
- Django 1.5.4 专题十 database relationships
- Django 1.5.4 专题15 south
- Django 1.5.4 专题16 logging
- Django 1.5.4 专题26 Bootstrap
- Django 1.5.4 专题17 Form Service
- Django 1.5.4 专题18 User Profile
- Django 1.5.4 专题26 Bootstrap
- Django 1.5.4 专题11 file uploading and updating database schema
- Django 1.5.4 专题20 fabric
- Django 1.5.4 专题三 添加admin.py
- Django 1.5.4 专题21 haystack whoosh
- Django 1.5.4 专题四 Template 提高
- Django 1.5.4 专题12 Ajax search 功能