2016-04-03 5 views
0

ich meinen alten Code aus Kolben sqlalchemyTypeerror: ungebundene Methode make_valid_name() muss mit Benutzerinstanz aufgerufen werden als erstes Argument (Unicode-Instanz statt bekam)

from flask.ext.sqlalchemy import SQLAlchemy 

zu sqlalchemy.orm Migration - Sitzungs maker

from sqlalchemy.orm import sessionmaker 

Modell

@staticmethod 
class User(Base): 
    __tablename__ = 'user' 
    id   = Column(Integer  , primary_key=True) 
    name  = Column(String(20)  , unique=True, nullable=False) 
. 
. 
. 
    def make_valid_name(name): 
     return re.sub('[^a-zA-Z0-9_\.]', '', name) 
Formular
def validate(self): 
. 
. 
.  
if self.name.data != User.make_valid_name(self.name.data): 
       self.name.errors.append('Please use letters, numbers, dots and underscores only.') 
       return False 

Während ein Aufruf der Methode self.validate machen() wirft folgende Fehler

TypeError: unbound method make_valid_name() must be called with User instance as first argument (got unicode instance instead) 

Ich bin nicht sicher, was geändert werden muss, wie kann ich „self.name.data validieren "Von Felddaten

Jede Hilfe zu diesem wird groß sein.

+0

Does '@ staticmethod' erscheint in dem Code, den Sie weggelassen haben? – dirn

+0

ja, es ist eine statische Methode. – Pradeep

Antwort

0

Option Nur war Benutzerobjekt erneut zu erstellen und Attribute initialisieren dann, dass anstelle von Formularobjektname als Parameter übergeben direkt

user = User(
name = self.name.data 
) 

if self.name.data != User.make_valid_name(user): 

und in Modell von

user.name 

gleichen Zugriff auf: @ müssen alles neu schreiben.

Jede andere optimale Lösung wird ebenfalls geschätzt. Wenn jemand anderes in Zukunft einem ähnlichen Problem gegenübersteht.

1

Dieser Fehler bedeutet User.make_valid_name ist eine Instanzmethode, keine statische Methode wie erwartet. Die Lösung, wenn Sie die vorhandene Nutzung behalten möchten, ist die Methode mit staticmethod dekorieren, nicht die Klasse:

class User(Base): 
    ... 
    @staticmethod 
    def make_valid_name(name): 
     return ... 

Alternativ können Sie es ein classmethod stattdessen machen:

class User(Base): 
    ... 
    @classmethod 
    def make_valid_name(cls, name): 
     return ... 
Verwandte Themen