【问题标题】:Send User detail to his email when django admin creates userdjango admin 创建用户时将用户详细信息发送到他的电子邮件
【发布时间】:2016-01-20 06:46:57
【问题描述】:

每当管理员通过 django admin 创建用户详细信息时,我一直在尝试将所有用户数据发送到他/她提供的电子邮件。我认为 post_save 信号应该用于此类过程。但是我的 post_save 信号不会在控制台上调用,并且管理员创建后也无法发送所有用户详细信息。我做错了什么?

Models.py

from __future__ import unicode_literals
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.core.mail import EmailMessage
from django.dispatch import receiver
from django.db import models

@receiver(post_save,sender=User)
def send_user_data_when_created_by_admin(sender, **kwargs):
    import inspect
    records = []
    for record in inspect.stack():
      print('record',record)
      records.append(record[3])
    if record[3]=='get_response':
      request = record[0].f_locals['request']
      first_name = request.POST.get('first_name')
      print('first name is',first_name)
      last_name = request.POST.get('last_name')
      address = request.POST.get('address')
      email = request.POST.get('email')
      html_content = "your first name:%s <br> last name:%s <br> address:%s"
      from_email = settings.DEFAULT_FROM_EMAIL
      message=EmailMessage('welcome',html_content %(first_name,last_name,address),from_email,[email])
      message.content_subtype='html'
      message.send()

class userbase(models.Model):
  first_name = models.CharField(max_length=100,blank=True,null=True,help_text=("enter the first name of user"))
  last_name = models.CharField(max_length=100,blank=True,null=True,help_text=("enter the last name"))
  address = models.CharField(max_length=300,blank=True,null=True,help_text=("enter the address"))
  contact = models.CharField(max_length=100,blank=True,null=True,help_text=("enter the contact"))
  email = models.EmailField(max_length=100,blank=True,null=True,help_text=("enter the email"))
  username = models.CharField(max_length=100,blank=True,null=True,help_text=("enter the username"))
  password = models.CharField(max_length=100,blank=True,null=True,help_text=("enter the strong password"))

  def __str__(self):
    return (self.username)

【问题讨论】:

  • 您应该在设置文件中将 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 更改为 EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' 以查看在信号被调用时发送的电子邮件
  • 我没有在控制台中获得名字,因为我已经打印了它以查看它是否工作。我的代码可能有什么问题?

标签: python django


【解决方案1】:

你应该把你的函数改成这个

@receiver(post_save,sender=UserProfile)
def send_user_data_when_created_by_admin(sender, instance, **kwargs):

      first_name = instance.user.first_name
      print('first name is',first_name)
      last_name = instance.user.last_name
      address = instance.address
      email = instance.user.email
      html_content = "your first name:%s <br> last name:%s <br> address:%s"
      message=EmailMessage(subject='welcome',body=html_content %(first_name,last_name,address),to=[email])
      message.content_subtype='html'
      message.send()

你的模型应该是这样的

class UserProfile(models.Model):
  address = models.CharField(max_length=300,blank=True,null=True,help_text=("enter the address"))
  contact = models.CharField(max_length=100,blank=True,null=True,help_text=("enter the contact"))
  user = models.ForeignKey(User)

  def __str__(self):
    return (self.username)

所以每当你想保存一个新对象时,你就使用这个

user = User.objects.create_user(username=username, email=email, password=password, first_name=first_name, last_name=last_name)
UserProfile.objects.create(user=user, contact=contact, address=address)
user.save()

其中 username、email、password、first_name、last_name、contact 和 address 是您创建的表单中各自字段值的清理数据。

您可以通过在 admin.py

中使用这些行来设计您的管理员在创建用户时强制创建用户配置文件
from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from account.models import UserProfile


class UserProfileInline(admin.StackedInline):
    model = UserProfile
    can_delete = False


class UserProfileAdmin(UserAdmin):
    inlines = (UserProfileInline,)


admin.site.unregister(get_user_model())
admin.site.register(get_user_model(), UserProfileAdmin)

如果您遇到任何错误,请告诉我

【讨论】:

  • 我了解您的代码的每一部分,除了 user = User.objects....是否与从管理面板创建用户相同?因为我希望管理员创建一个包含名字、姓氏等详细信息的用户。
  • 嘿,它对我有用,但我没有使用 instance.user.first_name,而是使用了 instance.first_name,我得到了想要的结果。我会将你的答案标记为已解决。
  • 您还可以设计您的管理员,以便在从管理页面创建用户时通过在 django User 表下显示 UserProfile 表来创建 UserProfile。检查我的代码答案。
  • 这个应用程序只是由管理员通过管理面板创建用户配置文件,并将创建的用户配置文件通过他/她的电子邮件发送给该用户。所以我认为模型中不会使用用户。 py.
  • 感谢您的帮助。干杯!
猜你喜欢
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 2016-04-05
  • 1970-01-01
相关资源
最近更新 更多