Django自动邮件

时间:2018-05-19 06:40:57

标签: python django

过去几天我一直在尝试学习django,到目前为止我已经制作了一个基本的bug跟踪软件(使用django的管理部分) 我创建了一个名为bugs的表:

from django.db import models

# Create your models here.


class Bugs(models.Model):
    STATUS_CHOICE = (
        ('Work In Progress', 'Work In Progress'),
        ('Incomplete', 'Incomplete'),
        ('Completed', 'Completed')
    )
    Project_Name = models.CharField(max_length=100)
    Basic_Description = models.CharField(max_length=100)
    Detailed_Description = models.TextField(default='The Description, here.')
    Status = models.CharField(max_length=18, choices=STATUS_CHOICE)
    Assigned_to = models.CharField(max_length=100)
    Reported_by = models.CharField(max_length=50, blank=True, null=True)
    Reporters_Mail_ID = models.CharField(max_length=50, blank=True, null=True)
    Reported_Date = models.DateTimeField(null=True, blank=True)
    Created = models.DateTimeField(auto_now_add=True, null=True, blank=True)
    Updated = models.DateTimeField(auto_now=True, null=True, blank=True)
    Deadline_Date = models.DateTimeField(null=True, blank=True)
    image = models.FileField(null=True, blank=True)

    def __str__(self):
        return self.Project_Name + ' [' + self.Status + '] ' + self.Basic_Description + ' [' + self.Assigned_to + ']'

    class Meta:
        verbose_name_plural = "Bugs"

如何制作,以便在选择项目名称时自动选择Assigned_to

如何确保一旦将其分配给人员/状态被编辑/或SuperUser进行任何类型的编辑,邮件将被发送给分配给的人,并且当分配给Person进行编辑时,超级用户会收到一封邮件说已经进行了编辑?

不是那么重要但 我还想知道是否有办法确保当超级用户为其中一个管理员分配一些工作时,只有指定的管理员才能查看问题??

更新

这次让我试着更具描述性。

所以我有两种类型的用户: 第一个是超级用户,他决定应该将哪些错误放入列表中,还管理其他用户。 第二个是超级用户选择的其他普通用户(用户只能编辑超级用户添加的帖子)

数据库有12列,其中Project_NameAssigned_To为2。

我的问题是,

如何使超级用户进入Project_Name时,Assigned_To列已填满?

以此为例

Project_Name: Project1 ---> Assigned_To: Person1
Project_Name: Project2 ---> Assigned_To: Person2
Project_Name: Project3 ---> Assigned_To: Person3
Project_Name: Project4 ---> Assigned_To: Person4

现在,如果超级用户确定错误在项目1中,并且项目1由人员1处理,我如何使程序如果选择项目1,将在{{中自动选择人员1 1}}列?

一旦SuperUser选择SAVE选项(采用与上述相同的情况)。当SuperUser更新数据库时,如何让程序向Person1发送邮件?当Person1对数据库进行更改时,如何让程序向SuperUser发送邮件?

3 个答案:

答案 0 :(得分:0)

嗯,我不确定你的问题是什么,但据我了解,你首先需要为用户添加另一个字段,如下所示:

from django.contrib.auth import get_user_model
user = models.ForeignKey(get_user_model(), blank=True, null=True)

关于在保存或更新模型对象时发送电子邮件,您应该覆盖模型的save()方法并放置您想要执行的代码。

答案 1 :(得分:0)

你可以使用django信号, 超级用户保存或编辑时。您可以编写代码来实现您想要的任何内容。

from django.db.models.signals import post_save  

def send_email(sender, instance, created, **kwargs):
    # your code goes here...

post_save.connect(send_email, sender=Bugs)

参考:https://docs.djangoproject.com/en/2.0/ref/signals/#post-save

答案 2 :(得分:0)

好的,首先,通常的做法是将所有小写字母用于模型字段。 Python有一个名为PEP8的样式指南,它记录了编写python的所有最佳实践。所以看看这里开始吧; https://www.python.org/dev/peps/pep-0008/#descriptive-naming-styles

现在,如果您的assigned_to模型应该引用模型与您相关的用户,那么您应该按照Milad所说的那样做。将ForeignKey用于User模型,因为使用对数据有意义的关系有很多好处。

如果您希望assigned_to根据project_name自动填充,那么您必须使用javascript。您可能会在选择项目时发送一个AJAX请求,以使用项目值转到后端。然后发回该项目的受让人,该项目将在javascript中用于设置assigned_to字段的值。

只要在对模型进行更改时发送电子邮件,就应该在python中使用信号。例如,对对象进行更改时会触发Signals;

from django.core.mail import send_mail
from django.db.models.signals import post_save
from django.dispatch import receiver

from bugs.models import Bugs


@receiver(post_save, sender=Bugs)
def bugs_post_save(sender, instance=None, created=None, update_fields=None, **kwargs):
    if created or 'assigned_to' in update_fields:
        # We have a new object or the assignee has changed
        send_mail(
            'Subject here',
            'Here is the message.',
            'from@example.com',
            ['to@example.com'],
            fail_silently=False,
        )

有关电子邮件发送的文档为here

您的接收器功能可以包含在您的模型下方,也可以包含在application config中导入的特定signals.py模块中。这就像是;

# bugs/apps.py

from django.apps import AppConfig

class BugsConfig(AppConfig):
    name = 'bugs'
    verbose_name = "Bugs"

    def ready(self):
        # importing signals
        import signals