您的位置:首页 > 编程语言 > Go语言

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的内容

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: