2017-12-05 2 views
-1

Ich weiß, dass diese Frage schon oft gestellt wurde, aber ich habe keine Lösung gefunden, die mein Problem gelöst hat. Grundsätzlich habe ich eine Methode in einer Klassenansicht in Django, und diese Methode ruft eine andere Methode auf, die eine AttributeError: 'WSGIRequest' object has no attribute 'send_email' auslöst.'WSGIRequest' Objekt hat keine Attributmethode

Dies ist der Code:

class PartyListView(ListView): 
    # ... 
    # ... 

    def approve_party(self, party_id): 
     returnObj = {} 

     # get the party by id 
     party = party_repo.get_party_by_id(party_id) 
     if party is None: 
      returnObj['message'] = "The requested party doesn't exist." 
      jsonObj = json.dumps(returnObj) 
      return HttpResponse(jsonObj, status=404, content_type="application/json") 

     # change the status to Approved 
     party.party_status = Core.PartyStatus.Approved 
     party.save() 

     # email the party team on the approval 
     self.send_email(True, party) 

     # return a json success response 
     returnObj['message'] = "The party has been approved." 
     jsonObj = json.dumps(returnObj) 
     return HttpResponse(jsonObj, status=200, content_type="application/json") 

    def send_email(self, isApprovalEmail, party): 
     username = self.request.user.username 
     from_email = username + "@example.com" 
     recipient_list = [party.host.student_email] 
     cc = ['[email protected]'] 

     if isApprovalEmail: 
      subject = "APPROVED Party Registration for {}".format(party.party_time) 
      body = "approval email" 

      email = EmailMessage(subject, body, from_email, recipient_list, cc=cc) 
      email.send() 
     else: 
      subject = "REJECTED Party Registration for {}".format(party.party_time) 
      body = "rejection email" 

      email = EmailMessage(subject, body, from_email, recipient_list, cc=cc) 
      email.send() 

    # ... 
    # ... 

ich folgende Dinge ausprobiert haben:

  1. die Reihenfolge des Verfahrens neu anordnen send_email: Über approve_party, oben unten, am Boden.
  2. Schreiben Sie die gesamte Datei in einen anderen Editor, ohne etwas zu kopieren.
  3. Verwenden Sie PyCharms Convert-Einrückungen in Leerzeichen, um sicherzustellen, dass der Eindruck gut ist.
  4. Schreiben Sie andere Dummy-Funktionen in der Klasse und versuchen Sie sie von approve_party aufrufen - keiner von ihnen funktioniert.

Hier ist die vollständige Rückverfolgung:

Internal Server Error: /admin/parties/approve/151 
Traceback (most recent call last): 
    File "C:\Program Files\Python36\lib\site-packages\django\core\handlers\exception.py", line 41, in inner 
    response = get_response(request) 
    File "C:\Program Files\Python36\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Program Files\Python36\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "D:/Programming/Party-Reg\admin_dashboard\views.py", line 93, in approve_party 
    self.send_email(True, party) 
AttributeError: 'WSGIRequest' object has no attribute 'send_email' 
[05/Dec/2017 18:07:19] "GET /admin/parties/approve/151 HTTP/1.1" 500 17786 

Und approve_party in urls.py registriert ist wie folgt:

urlpatterns = [ 
    # ..., 
    url(r'^parties/approve/([0-9]*$)', views.PartyListView.approve_party, name="Approve Party"), 
    # ... 
] 
+0

Bitte den vollständigen Traceback einbeziehen. – Alasdair

+0

@Alasdair Ich aktualisierte die Frage mit dem vollständigen Traceback. –

+0

Bitte zeigen Sie den Code an, der 'approve_party' aufruft. – Alasdair

Antwort

1

Sie verwenden Klasse basierte Ansichten falsch. Klassenbasierte Ansichten sollten mit der as_view-Methode registriert werden.

url(r'^parties/approve/([0-9]*$)', views.PartyListView.as_view(), name="Approve Party"), 

jedoch in diesem Fall sieht es aus, wie es einfacher wäre, approve_party und send_email reguläre Funktionen anstelle von Methoden Ihrer Ansicht zu machen.

def approve_party(request, party_id): 
    returnObj = {} 
    ... 
    send_email(request, True, party) 

    return HttpResponse(jsonObj, status=200, content_type="application/json") 

def send_email(request, isApprovalEmail, party): 
    username = request.user.username 

dann Ihre URL-Muster ändern:

url(r'^parties/approve/([0-9]+$)', views.approve_party, name="approve-party"), 

Ich schlage vor, mit [0-9]+ statt [0-9]*, um sicherzustellen, dass die URL mindestens eine Ziffer enthält, und ich würde die Verwendung von Leerzeichen in URL-Muster Namen vermeiden .

+0

Danke, das hat funktioniert! Nur neugierig, warum funktioniert mein Code nicht? Ich habe meine klassenbasierte Ansicht wie angegeben registriert, und es scheint, als hätte die Klasse eine 'send_email'-Funktion. Warum hat Python das nicht erkannt? –

+0

'PartyListView.approve_party' ist keine gebundene Methode. Wenn Sie es in Ihrem URL-Muster verwenden, ist "self" die Anfrage anstelle der View-Instanz, sodass Sie den Attributfehler erhalten. Die Verwendung von 'as_view()' wird das beheben, aber es gibt keinen Code, der die Methode 'approve_party' aufruft. – Alasdair

+0

Das macht Sinn, danke! –

Verwandte Themen