我正在用户模型中注册数据,并且还希望同时保存配置文件数据,如配置文件模型中的first_name和last_name。
所以我使用django信号来存储个人资料信息并将邮件发送给用户。
但我们无法获取信号文件中的first_name和last_name:
#---------------------------- Create profile at the time of registration --------------------------#
def register_profile(sender, **kwargs):
if kwargs.get('created'):
user = kwargs.get('instance')
request = kwargs.get("request")
if user.id is not None and user._disable_signals is not True:
profile = Profile(user=user)
if user.status is not 1:
#------------------- Send the registration mail to user and it have confirmation link ----------#
salt = hashlib.sha1(str(random.random())).hexdigest()[:5]
activation_key = hashlib.sha1(salt+user.email).hexdigest()
key_expires = datetime.datetime.today() + datetime.timedelta(2)
#print user
profile.activation_key = activation_key
profile.key_expires = key_expires
#--------------------- End -------------------------------------------------------------#
profile.save()
if user.status is not 1:
user = model_to_dict(user)
BaseSendMail.delay(user,type='account_confirmation',key = activation_key)
return
post_save.connect(register_profile, sender=User, dispatch_uid='register_profile')
#-------------------------- End ---------------------------------------------------------------------#
在上面的代码中,我无法获取在注册时发送的first_name和last_name数据。另外我想提一下first_name和last_name字段属于配置文件模型。
答案 0 :(得分:2)
不,你不应该试试。信号可以从任何地方执行:管理脚本,Celery任务,可能没有请求的各种地方。
您可以暂时将数据存储在User实例上,就像使用_disable_signals
属性一样。但是我怀疑这在信号中并不是最好的;由于您要保存表单提交的结果,并且它取决于该表单中的数据,您应该在视图或表单本身中执行此操作。
答案 1 :(得分:-1)
我做到了这一点并且有效。 不确定它对性能等的影响。
some_file.py:
data = {}
middleware.py:
class MyMiddleware(object):
def process_request(self):
from path.to.some_file import data
data['request'] = self.request
signals / model_method / manager / template tag / any where:
from path.to.some_file import data
request = data.get('request')