Skip to main content
 首页 » 编程设计

python之当 django 管理员创建用户时,将用户详细信息发送到他的电子邮件

2024年10月24日27小虾米

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

模型.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) 

请您参考如下方法:

你应该把你的功能改成这个

@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() 

其中用户名、电子邮件、密码、名字、姓氏、联系人和地址是您创建的表单中各自字段值的清理数据。

您可以通过在 admin.py

中使用这些行,将管理员设计为在创建用户时强制创建 UserProfile
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) 

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