2017-02-20 1 views
0

Ich bin definitiv ein Neuling für Django, und habe Tutorials und Stack-Überlauf verwendet, um meine App zu entwerfen.Warum ist meine Django-Vorlage als Benutzer auf dasselbe Objekt eingestellt?

Meine App verfolgt Fallarbeit für Benutzer. Eine Sache, die ich tun muss, ist, dass ich als ein Benutzer angemeldet bin und die Caseload für einen anderen Benutzer ansehe.

Wenn diese Seite erscheint, sagt das Bit, das normalerweise "Logout Joe Bloggs" sagen würde, wo Joe Bloggs der angemeldete Benutzer ist, sagt "Logout Fitzwilliam Darcy" wo Fitzwilliam Darcy der Benutzer ist, den ich die Fallarbeit von sehen sollte .

Ich möchte nicht wirklich die App weiter entwickeln, bis ich es behoben habe, für den Fall, dass dies ein Symptom für ein zugrunde liegendes Problem ist, das in Zukunft weitere Probleme verursachen wird.

Ich füge hinzu, was ich denke, alle relevanten Bits sind hier, aber wenn es noch etwas braucht, lass es mich wissen, und ich werde mich freuen, zu bearbeiten.

#urls.py 

url(r'cases/(?P<slug>\w+)',views.UserCasesView.as_view(),name='cases'), 

#views.py 

@method_decorator(login_required,name='dispatch') 
class UserCasesView(generic.DetailView): 

    model = models.User 
    template_name = 'caseworkclub/caseworker_detail.html' 
    slug_field = 'username' 

#models.py 

class User(AbstractUser):           

    association = models.ForeignKey('Association',null=True) 

    def full_name(self): 
     return("{} {}".format(self.first_name,self.last_name) 

    def open_cases(self): 
     return(Case.objects.filter(closed__isnull=True,caseworker=self)) 

Die Schnecke Bit ist so, dass der Benutzername in der URL kann nach this answer to another question

Es könnte auch wert sein, zu erklären, wenn die models.py Bit nicht weg nicht geben, dass ich verlängert habe die Basisbenutzerklasse und verwende diese, anstatt die Benutzerprofiltechnik. Das Problem scheint jedoch entstanden zu sein, seit das Slug-Bit oben geändert wurde.

Jede Hilfe sehr geschätzt, und wie gesagt - keine weiteren Infos, gerne zur Verfügung stellen!

James

+0

Was passiert, wenn Sie 'request.user' im Abmelde Abschnitt' user' ändern? – Lucas

+0

Können Sie Ihre Vorlagen anzeigen? – GwynBleidD

Antwort

1

Dies ist, weil Sie nicht die get_context_data() Methode Ihrer UserCasesView Klasse mit einem vernünftigen Standard außer Kraft gesetzt haben. Es verwendet derzeit den Modellnamen (der zufällig auch user ist), der mit der eingebauten user Variablen konfligiert, die von django.contrib.auth.context_processors.auth Kontextprozessor gesetzt wird.

Von the documentation:

Variablen Kontext überschreiben Werte aus Vorlage Kontext Prozessoren

Alle Variablen aus get_context_data() Vorrang vor den Kontextvariablen von Kontext-Prozessoren. Wenn Ihre Ansicht beispielsweise das Modellattribut auf Benutzer setzt, überschreibt der Standardkontextobjektname des Benutzers die Benutzervariable aus dem Kontextprozessor django.contrib.auth.context_processors.auth(). Verwenden Sie get_context_object_name(), um einen Konflikt zu vermeiden.

Versuchen Sie den Objektnamen von user auf etwas anderes (wie case_user) zu ändern:

class UserCasesView(generic.DetailView): 
    ... 
    context_object_name = 'case_user' 
+0

Das löst es, danke! Ich bin erstaunt, dass ich nur diese eine Zeile ändern musste, und keinen Verweis auf das hinzufügen, was ich irgendwo hinzugefügt habe? –

Verwandte Themen