J'essaie de créer une application Web avec Tornado et j'aimerais ajouter certaines des fonctionnalités de style du paquetage Python Deform. Ci-dessous, j'essaie de mettre en œuvre un formulaire de connexion utilisateur en combinant Tornado et Deform. Cependant, une erreur est en train d'être soulevée: TypeError: __init__() takes exactly 2 arguments (3 given)
.Implémentation de la déformation avec tornade
class demonstrate(object):
def __init__(self, title):
self.title = title
def __call__(self, method):
method.demo = self.title
return method
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render('/Users/jamespetullo/Downloads/studenthost-master/studentscout/home.html')
@view_defaults(route_name='student_register')
class StudentRegster(tornado.web.RequestHandler):
def __init__(self, request):
self.request = request
self.macros = get_renderer('templates/main.pt').implementation().macros
def render_form(self, form, appstruct=colander.null, submitted='submit',
success=None, readonly=False, is_i18n=False):
captured = None
if submitted in self.request.POST:
try:
controls = self.request.POST.items()
captured = form.validate(controls)
if success:
response = success()
if response is not None:
return response
html = form.render(captured)
except deform.ValidationFailure as e:
html = e.render()
else:
html = form.render(appstruct, readonly=readonly)
if self.request.is_xhr:
return Response(html)
code, start, end = self.get_code(2)
locale_name = get_locale_name(self.request)
reqts = form.get_widget_resources()
printer = pprint.PrettyPrinter(width=1)
printer.format = my_safe_repr
output = printer.pformat(captured)
captured = highlight(output,
PythonLexer(),
formatter)
# values passed to template for rendering
return {
'form':html,
'captured': captured,
'code': code,
'start':start,
'end':end,
'is_i18n':is_i18n,
'locale': locale_name,
'demos':self.get_demos(),
'title':self.get_title(),
'css_links':reqts['css'],
'js_links':reqts['js'],
}
@view_config(renderer='templates/form.pt', name='edit')
@demonstrate('Edit Form')
def get(self):
import datetime
class Mapping(colander.Schema):
name = colander.SchemaNode(
colander.String(),
description='Content name')
date = colander.SchemaNode(
colander.Date(),
widget=deform.widget.DatePartsWidget(),
description='Content date')
class Schema(colander.Schema):
number = colander.SchemaNode(
colander.Integer())
mapping = Mapping()
schema = Schema()
form = deform.Form(schema, buttons=('submit',))
appstruct = {
'number': 42,
'mapping': {
'date': datetime.date(2010, 4, 9),
}
}
return self.render_form(form, appstruct=appstruct)
Mon principal problème est que je suis incapable de combiner la méthode Tornado get
et servir les modèles déforment. Est-ce que quelqu'un peut-il me montrer la bonne direction? S'il vous plaît laissez-moi savoir de toutes les questions que vous avez.
Edit:
Voici la pleine retraçage:
ERROR:tornado.application:Uncaught exception
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/tornado/http1connection.py", line 238, in _read_message
delegate.finish()
File "/Library/Python/2.7/site-packages/tornado/routing.py", line 251, in finish
self.delegate.finish()
File "/Library/Python/2.7/site-packages/tornado/web.py", line 2096, in finish
self.execute()
File "/Library/Python/2.7/site-packages/tornado/web.py", line 2116, in execute
**self.handler_kwargs)
TypeError: __init__() takes exactly 2 arguments (3 given)
Pouvez-vous partager un retraçage? Cela révèlera quelle ligne passe le mauvais nombre d'arguments à la méthode \ _ \ _ init \ _ \ _ d'une classe. –
@ A.JesseJiryuDavis s'il vous plaît voir ma récente édition. – Ajax1234
Le retraçage est trop vague. Mais si je dois deviner, je dirais que comme vous avez décoré le gestionnaire 'StudentRegister' avec' @ view_defaults', ce décorateur passe un argument supplémentaire à 'StudentRegister', mais comme vous pouvez le voir, c'est' __init__' prend seulement deux arguments. Je pense que vous devriez essayer de le changer à quelque chose comme '__init __ (self, request, * args)' et voir si cela fonctionne. – xyres