2016-01-07 2 views
0

Я регистрирую данные в пользовательской модели, а также хочу сохранять данные профиля одновременно с именем 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 данных, посылаемых во время registration.Also я хотел что поля first_name и last_name принадлежат модели профиля.

ответ

2

Нет, и вы не должны пытаться. Сигналы могут быть выполнены из любого места: сценарий управления, задача Celery, всевозможные места, которые могут не иметь запроса.

Вы можете временно сохранить данные на экземпляре пользователя, как и с атрибутом _disable_signals. Однако я подозреваю, что это не лучше всего сделать в сигнале; поскольку вы сохраняете результат отправки формы, и это зависит от данных в этой форме, вы должны действительно сделать это в представлении или самой форме.

-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 

сигналы/model_method/менеджер/шаблонный тег/где-либо еще:

from path.to.some_file import data 
request = data.get('request') 
+0

Вы не должны использовать глобальные переменные в django, и этот импорт не достигнет того, чего вы хотите. ither. –

Смежные вопросы