Использование концепции сигналов для выполнения событий

Это я делаю для отправки почты после обновления записи в базе данных. Я определил получателей в отдельном файле с именем listeners.py для получения сигналов.

signal.py

import django.dispatch

send_email_to = django.dispatch.Signal()

слушатели.py

@receiver(send_mail_to)
def send_update(sender, instance, created, **kwargs):
    if instance.author_name:
        message = "Book details has been updated"
        subject = "Book updates"
        send_mail(subject, message, settings.DEFAULT_FROM_EMAIL,[instance.email,])

post_save.connect(send_update, sender=Book)

просмотры.py

def addbook(request):      

    form = BookForm

    if request.POST:
        form = BookForm(request.POST)

        if form.is_valid():
            cd = form.cleaned_data
            form.save()
            post_save.connect(send_update, sender=Book)     
            return redirect('/index/')
    return render_to_response('addbook.html',{ 'form':form },context_instance=RequestContext(request))

Я получаю сообщение об ошибке, как показано ниже.

NameError at /addbook/
global name 'send_update' is not defined
Request Method: POST
Request URL:    http://localhost:8000/addbook/
Django Version: 1.4.3
Exception Type: NameError
Exception Value:    
global name 'send_update' is not defined
Exception Location: /root/Samples/DemoApp/DemoApp/views.py in addbook, line 50
Python Executable:  /usr/bin/python
Python Version: 2.7.0
Python Path:    
['/root/Samples/DemoApp',
 '/usr/lib/python2.7/site-packages/distribute-0.6.28-py2.7.egg',
 '/usr/lib/python27.zip',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-linux2',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/lib/python2.7/site-packages',
 '/usr/lib/python2.7/site-packages/PIL',
 '/usr/lib/python2.7/site-packages/gst-0.10',
 '/usr/lib/python2.7/site-packages/gtk-2.0',
 '/usr/lib/python2.7/site-packages/setuptools-0.6c11-py2.7.egg-info',
 '/usr/lib/python2.7/site-packages/webkit-1.0']
Server time:    Sat, 23 Mar 2013 19:05:01 +0500

Может ли кто-нибудь увидеть, в чем будет проблема.

Спасибо


person user2086641    schedule 23.03.2013    source источник
comment
Могу ли я узнать, в чем проблема?   -  person user2086641    schedule 24.03.2013


Ответы (1)


Потому что вы определили send_update в своих представлениях, которые не имеют значения. Вот почему ошибка говорит, что вам нужно определить файл send_update.

Но почему вы ставите post_save.connect(send_update, sender=Book) в своих представлениях? Вы должны удалить это. Это уже понятно в вашем listeners.py. Итак, какое бы действие вы ни совершали с использованием модели Book, эта модель отправит запрос на этот сигнал.

person catherine    schedule 24.03.2013
comment
вы изменяете мой ответ, чего вы пытаетесь достичь? Или вы хотите научиться использовать сигналы? - person catherine; 24.03.2013
comment
я хочу узнать больше о сигналах, но в django doc примеры, которые они привели, были мне непонятны - person user2086641; 25.03.2013
comment
Хорошо, я понимаю, но верните коды в оригинал, чтобы он работал. У меня есть блог, я пишу там о том, как использовать Django, просто основные коды. Планирую еще выложить сигнал, но еще не опубликовал. catherinetenajeros.blogspot.com - person catherine; 25.03.2013
comment
Кэтрин, не могли бы вы проверить этот ТАК-вопрос без флажка"> stackoverflow.com/questions/17652075/ - person user2086641; 15.07.2013