每当管理员通过 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
中使用这些行,将管理员设计为在创建用户时强制创建 UserProfilefrom 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)
如果您遇到任何错误,请告诉我
