2017-04-25 5 views
1

Ich versuche, ein einfaches Webformular CherryPy in Python 3.5 (zu vergleichen mit einer sqlite3-Datenbank) zu erzeugen, die ein paar Eingänge von verschiedenen Arten von Daten übernimmt. Wenn die Kontrollkästchen nicht markiert sind, wird ein Fehler erzeugt, da (wie ich annehme) kein Standard-Nullwert vorhanden ist. Es ist entweder 'an' oder nicht vorhanden. Wie kann ich mein Formular so ändern, dass es leere Kästchen automatisch auf "Keine" setzt? Hier ist der Code (Abschnitt):CherryPy Webformular: Kontrollkästchen erzeugt Fehler, wenn nicht markiert

class startScreen(object): 
    @cherrypy.expose 
    def index(self): 
     return """<form method="post" action="search"> 
     Job Title:<br> 
     <input type="text" name="title"><br> 
     Employer name:<br> 
     <input type="text" name="employer"><br> 
     Minimum Starting Salary:<br> 
     <input type="number" name="minsal"><br> 
     Contract Hours Per Week:<br> 
     <input type="number" name="hpwMin"> 
     <input type="number" name="hpwMax"><br> 
     Start Date:<br> 
     <input type="date" name="startDate"><br> 
     <!--jobtype drop down menu--!> 
     Contract Length (months):<br> 
     <input type="number" name="CLMin"> 
     <input type="number" name="CLMax"><br> 
     <!--qualifications list--!> 
     <!--key skills list--!> 
     Training Offered:<br> 
     <input type="checkbox" name="training"><br> 
     Expenses covered:<br> 
     <input type="checkbox" name="expenses"><br> 
     Job benefits:<br> 
     <input type="checkbox" name="benefits"><br> 
     Number of days annual holiday: <br> 
     <input type="number" name="holiday"><br> 
     Opportunities abroad:<br> 
     <input type="checkbox" name="abroad"><br> 
     Date posted: <br> 
     <input type="date" name="datePosted"><br> 


     <button type="submit">Submit</button> 
     </form> 

     """ 
    @cherrypy.expose #needed for every page 
    def search(self, title, employer, minsal, hpwMin, hpwMax, startDate, CLMin, CLMax, training, expenses, benefits, holiday, abroad, datePosted): 
     search.search.searchDBS(title, employer, minsal, hpwMin, hpwMax, startDate, CLMin, CLMax, training, expenses, benefits, holiday, abroad, datePosted) 
     return "done" 

Dies ist die Ausgabe auf der Webseite, wenn die eine tickbox nicht markiert ist:

404 Not Found 

Missing parameters: training 

Traceback (most recent call last): 
    File "C:\Users\Anna\AppData\Local\Programs\Python\Python35\lib\site-packages\cherrypy\_cpdispatch.py", line 60, in __call__ 
    return self.callable(*self.args, **self.kwargs) 
TypeError: search() missing 1 required positional argument: 'training' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "C:\Users\Anna\AppData\Local\Programs\Python\Python35\lib\site-packages\cherrypy\_cprequest.py", line 670, in respond 
    response.body = self.handler() 
    File "C:\Users\Anna\AppData\Local\Programs\Python\Python35\lib\site-packages\cherrypy\lib\encoding.py", line 221, in __call__ 
    self.body = self.oldhandler(*args, **kwargs) 
    File "C:\Users\Anna\AppData\Local\Programs\Python\Python35\lib\site-packages\cherrypy\_cpdispatch.py", line 66, in __call__ 
    raise sys.exc_info()[1] 
    File "C:\Users\Anna\AppData\Local\Programs\Python\Python35\lib\site-packages\cherrypy\_cpdispatch.py", line 64, in __call__ 
    test_callable_spec(self.callable, self.args, self.kwargs) 
    File "C:\Users\Anna\AppData\Local\Programs\Python\Python35\lib\site-packages\cherrypy\_cpdispatch.py", line 163, in test_callable_spec 
    raise cherrypy.HTTPError(404, message=message) 
cherrypy._cperror.HTTPError: (404, 'Missing parameters: training') 

Antwort

2

, dass das regelmäßige Verhalten des HTML-Kontrollkästchen ist, können Sie damit umgehen mit einem Standardargument: training=None oder verwenden Sie Kwargs und suchen Sie nach dem Schlüssel.

Für die erste Option würde Ihre aussetzen Methode:

@cherrypy.expose #needed for every page 
def search(self, title, employer, minsal, hpwMin, hpwMax, 
      startDate, CLMin, CLMax, expenses, 
      benefits, holiday, abroad, datePosted, training=None): 
    # "training" will be None, if the checkbox is not set 
    # you can verify with something like: 
    # if training is None: 
    # ... 
    search.search.searchDBS(
     title, employer, minsal, hpwMin, hpwMax, 
     startDate, CLMin, CLMax, training, expenses, 
     benefits, holiday, abroad, datePosted) 
    return "done" 

Eine weitere Alternative (besser aus meiner Sicht, weil die viele Parameter für eine Methode sind, können Sie die **params Alternative verwenden:

@cherrypy.expose #needed for every page 
def search(self, **params): 
    fields = ['title', 'employer', 'minsal', 'hpwMin', 
       'hpwMax', 'startDate', 'CLMin', 'CLMax', 
       'training', 'expenses','benefits', 'holiday', 
       'abroad','datePosted'] 
    # the params.get, will try to get the value if the field 
    # and if is not defined, then it will return None 
    search.search.searchDBS(*[params.get(f, None) for f in fields]) 
    # alternative approach without passing specific fields 
    #if 'training' not in params: 
    # params['training'] = None 
    #search.search.searchDBS(**params) 
    return "done" 
+0

Danke! ich ohne Erfolg bereits in dem Methodenaufruf das Standardargument von ‚Training = None‘ versucht hatte, vielleicht meine Syntax falsch war. ich habe Ihre zweite Lösung verwendet und es funktionierte eine Festlichkeit. – fianchi04

Verwandte Themen