【问题标题】:Django CustomUser created in Admin, User notification by emailDjango CustomUser 在管理员中创建,通过电子邮件通知用户
【发布时间】:2019-09-03 11:57:19
【问题描述】:

爱好开发者,Python 和 Django 新手。

正在处理项目,其中包括通过管理后端使用 CustomUser(AbstractUser) 模型创建新用户。在 [保存] 我想自动发送电子邮件到新用户电子邮件 [To:] 并共享管理员创建新用户时提供的用户名和密码。

我在 MacOS 上使用 Python3.7 Django 2.2。在虚拟环境 [Conda] 中进行开发。开发环境中的电子邮件服务器设置为后端文件类型。我已经在论坛上进行了“广泛”搜索 [包括这个] ...尝试了我能找到的示例代码。我已经能够在表单保存时发送 [然后在后端文件中接收] 电子邮件,但不知道如何在电子邮件中包含表单变量。

VIEWS.py

from django.shortcuts import render
from django.core.mail import send_mail


def notification_mail_send(request):

    form = CustomUserCreationForm(request.POST)

    if form.is_valid():
        # SET UP MAIL CONTENT AND SEND MAIL
        pass

FORMS.py

from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):

    class Meta(UserCreationForm):
        model = CustomUser
        fields = ('username', 'owner_fullname', 'email')

class CustomUserChangeForm(UserChangeForm):

    class Meta(UserChangeForm):
        model = CustomUser
        fields = ('username', 'owner_fullname', 'email')

【问题讨论】:

  • Django 允许您将信号分配给模型对象。当模型上发生某些条件时,这些会被执行。本质上,您正在利用 django 中的事件,以使用它们来执行某些操作。 docs.djangoproject.com/en/2.2/topics/signals
  • @Rupin 谢谢。我现在在 CustomUser 的 models.py 中使用 @receiver(post_save,sender=CustomUser),因此当用户创建或用户更改指令保存到模型时,用户会发送和接收一封电子邮件 [同一个!]。但是,我在登录时知道用户也收到了相同的电子邮件 [!] 我假设用户登录时“某物”已保存到模型 [?] ...我猜不同的“创建”和“更改”指令接收者应该遵循自定义表单,也许是 form_valid()?目标是让不同的电子邮件发送用户更改和用户创建,用户登录时没有。
  • 当登录发生时,用户模型被更新。有一个字段可以更新用户的上次登录时间。您可以查看该字段并将其与当前服务器时间进行比较,如果差异小于某个时间间隔,则不触发您的电子邮件。
  • @Rupin 知道了!只需在models.py的post_save_receiver(sender, instance, created, **kwargs):函数中添加if created: 即可解决。
  • 请在此题中添加正确答案,并将其标记为已回答。

标签: python django-forms


【解决方案1】:

您应该能够使用form.cleaned_data[field_name] 访问表单数据,其中field_name 将例如是"username"

如果您使用 Django 模板来构建您的电子邮件内容,请将表单对象作为上下文传递并使用例如{{ form.cleaned_data.username }}

【讨论】:

    【解决方案2】:

    使用 django 管理员时,您无需编写自定义视图和表单。

    如果您想更改管理员的行为,您通常需要覆盖 ModelAdmin 类。

    在你的情况下,我建议覆盖save_model()

    【讨论】:

      【解决方案3】:

      感谢我的开发伙伴们的帮助。我深入研究了 Rupin 的建议,并使用“信号”成功应用:http://docs.djangoproject.com/en/2.2/topics/signals。只需在models.py中的post_save_receiver(sender, instance, created, **kwargs): 函数中添加'if created'即可解决。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多