2017-02-10 14 views
0

Я работаю с Web2Py. Я пытаюсь включить текстовое поле, которое, как представляется, не определено нигде, но каким-то образом появляется на веб-странице.Python не интерпретировать True - объект «NoneType» не поддерживает назначение объекта

в любом случае.

Если пользователь, входящий в систему, принадлежит определенной группе, текстовое поле включено и пользователь может писать в текстовое поле. Если они не являются членами группы, текстовое поле отключено - они могут читать ранее, но не могут вводить его.

Код, который, кажется, затрагивает включенном состоянии этот

if __userCanPerformStep(step) and not flow_completed: 
    flow_step_forms[step.name].element('textarea')['_rows'] = 5 

__userCanPerformStep (этап) определяется как

def __userCanPerformStep(step_row): 
    if auth.user.id in step_row.target_users: 
     return True 

    for group_id in step_row.target_groups: 
     if db((db.auth_membership.user_id == auth.user.id) & (db.auth_membership.group_id == group_id)).count() > 0: 
      return True 

    if auth.has_group_membership("systemadmin"): 
     return True 
    return False 

has_group_membership определяется как

def has_group_membership(self, groupname): 
     if self.db((self.db.auth_group.id > 0) & (self.db.auth_group.role==groupname)).count() > 0: 
      group_id = self.db((self.db.auth_group.id > 0) & (self.db.auth_group.role==groupname)).select().first().id 
      return self.has_membership(group_id) 

     return False 

Поскольку __userCanPerformStep используется во многих местах, я создал новый метод как таковой:

def canAddComment(step_row): 
    if auth.has_group_membership_or(["groupA", "groupB", "groupC"]): 
      return False 
    if auth.user.id in step_row.target_users: 
      return False 
    return False 

и has_group_membership_or определяется как

def has_group_membership_or(self, groupnames): 
     if self.db((self.db.auth_group.id > 0) & (self.db.auth_group.role.belongs(groupnames))).count() > 0: 
      for groupname in groupnames: 
       group = self.db((self.db.auth_group.id > 0) & (self.db.auth_group.role==groupname)).select().first() 
       if group and self.has_membership(group.id): 
        return True 

     return False 

, когда я теперь вызвать функцию как часть IF такой как:

if ((canAddComment(step)) and (not flow_completed)): 
       flow_step_forms[step.name].element('textarea')['_rows'] = 5 

и каждый раз, когда пользователь принадлежит к одной из групп A, B или C. Я получаю следующее сообщение об ошибке:

объект «NoneType» не поддерживает назначение элемента

любые намеки ?? SIDE NOTE Я также заставил функцию немедленно вернуть False, и я не получаю никаких ошибок. Если я заставлю Истину; Я получаю ошибки. форсирование выполняется просто, если первая строка метода равна return True

Вопрос: как я могу заставить python интерпретировать мою функцию, вызываемую, чтобы принять значение True? что я пропускаю?

UPDATE Полный отслеживающий является enter image description here

+2

Опубликовать полную трассировку стека. он скажет вам, какой объект «Нет», а где «Нет». – TemporalWolf

ответ

1
None['_rows'] = 5 

бросает

TypeError: 'NoneType' object does not support item assignment 

Так flow_step_forms[step.name].element('textarea') возвращает None, предположительно потому, что flow_step_forms[step.name] не имеет ни одного элемента 'textarea' или элемент установлен в None.

Если вам нужна дополнительная помощь по устранению неполадок, пожалуйста, отредактируйте свой вопрос, чтобы указать, где вы его установите, и я отредактирую свой ответ.