2017-05-11 2 views
1

Ich habe diese Frage umbenannt, nachdem ich tiefer getaucht bin und festgestellt habe, dass das Root-Problem dazu geführt hat, dass die Nachrichten nicht angezeigt wurden.Django Redirects funktioniert nicht wie erwartet

Ich versuche, auf eine Aktionsstatusseite umzuleiten, um ein Warning/Success-Banner anzuzeigen, wenn eine bestimmte Django-Ansicht eine Nachricht zurückgibt, um den Benutzer zu informieren, dass ich keine Formulare verwende.

Unten ist der Code, den ich vorher gesehen habe gefragt, lass es mich wissen, wenn Sie mehr brauchen!

settings.py

INSTALLED_APPS = [ 
    'serversignup.apps.ServersignupConfig', 
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
] 

MIDDLEWARE = [ 
    'django.middleware.security.SecurityMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
] 

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 

message.html

{%extends 'serversignup/base.html' %} 
{% block content %} 
<div class="col-sm-2 col-md-12 main-content"> 
    {% if messages %} 
     <div class="alert alert-warning"> 
     {% for message in messages %} 
      <strong>Action Failed: </strong> {{ message }} 
     {% endfor %} 
     </div> 
    {% endif %} 
{% endblock %} 

aktualisieren ich einen Test erstellt, das funktioniert, und den Code aus dem Test gespiegelt, aber es tut nicht arbeiten. Test unten.

views.py

def test(request): 
    messages.add_message(request, messages.WARNING, 'Success in signing out') 
    return redirect('/messageAlert') 


def update_signout_status(request): 
    if request.method == 'POST': 
     ... 
     ... 
     ... 
     else: 
      messages.add_message(request, messages.WARNING, 'This machine has already been claimed.') 
    return redirect('/mesageAlert') 


def message_alert(request): 
    return render(request, 'serversignup/message.html', {}) 

urls.py

urlpatterns = [ 
    url(r'^test/$', views.test, name='test'), 
    url(r'^messageAlert/$', views.message_alert, name='alerts'), 
    url(r'^updateSignoutStatus/$', views.update_signout_status, name='update_signout_status'), 
] 

Google Chrome Netzwerk Inspektor zeigt folgendes:

Szenario # 1: POST Anfrage geht an 'updateSignoutStatus /'

Request URL:http://x.x.x.x/updateSignoutStatus/ 
Request Method:POST 
Status Code:302 Found 
... 
Request URL:http://x.x.x.x/messageAlert 
Request Method:GET 
Status Code:301 Moved Permanently (from disk cache) 
... 
Request URL:http://x.x.x.x/messageAlert/ 
Request Method:GET 
Status Code:200 OK 

Verhalten

Seite ändert sich nicht auf die umgeleitet Seite.

[17/May/2017 09:30:32] "POST /updateSignoutStatus/ HTTP/1.1" 302 0 
[17/May/2017 09:30:32] "GET /messageAlert/ HTTP/1.1" 200 1454 

Szenario 2: GET Anfrage geht an 'test /'

Request URL:http://x.x.x.x/test/ 
Request Method:POST 
Status Code:302 Found 
... 
Request URL:http://x.x.x.x/messageAlert 
Request Method:GET 
Status Code:301 Moved Permanently 
... 
Request URL:http://x.x.x.x/messageAlert/ 
Request Method:GET 
Status Code:200 OK 

Verhalten

Seite DOES auf die umgeleitet Seite ändern.

[17/May/2017 09:23:25] "GET /test HTTP/1.1" 301 0 
[17/May/2017 09:23:26] "GET /test/ HTTP/1.1" 302 0 
[17/May/2017 09:23:26] "GET /messageAlert HTTP/1.1" 301 0 
[17/May/2017 09:23:26] "GET /messageAlert/ HTTP/1.1" 200 1446 

Edit # 1: Modified Code aktuellen Zustand zu reflektieren nach Einsicht empfangen, wie Nachrichten arbeiten, Problem weiterhin besteht nach wie vor.

Bearbeiten # 2: Hinzugefügt mehr Kontext zu index.html & views.py-Code.

Bearbeiten # 3: Update zum Thema.

Antwort

0

Ich bin nicht sicher, warum das passiert ist, aber das Problem scheint gelöst zu sein. Die Änderungen, die ich machte, waren die folgenden:

Zuvor habe ich Javascript verwendet, um die POST-Anfrage zu erstellen, die die Kette zu der Umleitungsnachricht führen würde.

Ich habe inzwischen auf die Verwendung eines HTML-Formulars für den POST umgeschaltet und das Verhalten funktioniert jetzt. Ich glaube, das Problem hat etwas mit dem Datentyp zu tun, der über Javascript gesendet wurde und erzeugte die xhr-Nachricht als Antwort.

1

Das Iterieren über die Nachrichten hat den Effekt, dass sie gelöscht werden.Wenn Sie diese for-Schleife in Ihrer Ansicht haben, werden sie gelöscht, bevor die Vorlage gerendert wird.

Diese Schleife entfernen.

+0

Ich habe die Schleife entfernt und es immer noch nicht angezeigt, danke für den Rat, aber ich wusste das nicht. – Chex

0

Nachrichten werden gelöscht, sobald sie verarbeitet wurden. Um dies zu vermeiden,

storage = messages.get_messages(request) 
for message in storage: 
    print(message) 
storage.used = False 
+0

Danke! Jemand hat mich gebeten, die Schleife zu entfernen, die ich gemacht habe, leider bleibt das Problem auch ohne die Schleife bestehen. – Chex

+0

Ok. Was gibt es im Zusammenhang? Dann, wenn Sie Ihre vollständige index.html veröffentlichen können, bitte posten Sie es auf Frage – itzMEonTV

+0

Versuchen Sie diese 'MESSAGE_STORAGE =' django.contrib.messages.storage.session.SessionStorage'' in settings.py – itzMEonTV

0

Überprüfen Sie COOKIE_SESSION_DOMAIN Einstellung. Ich hatte ein Problem einmal mit fehlenden Nachrichten aufgrund dieser Einstellung mit einem anderen Domänennamen als die Website, wo der Code tatsächlich ausgeführt wird. So konnte Django keine Nachrichten von der Sitzung lesen.

+0

Während ich die Website entwickle ich auf Basis von http: // /Ort und nicht eine tatsächliche Domain Name URL, könnte dies das Problem sein? – Chex

+0

Ja, wenn Sie 'COOKIE_SESSION_DOMAIN' auf eine bestimmte Domain eingestellt haben. Öffnen Sie einfach die Django-Shell und führen Sie folgendes aus: 'from django.conf import settings; Drucken (settings.COOKIE_SESSION_DOMAIN) ' –

Verwandte Themen