2017-11-24 3 views
0

Ich bin relativ neu in Django und Web-Entwicklung im Allgemeinen. Grundsätzlich möchte ich eine eingeloggte Benutzerdaten aus einer Datenbanktabelle abrufen, so dass er auf einer Seite "Mein Profil" anzeigen/bearbeiten kann.Django - Wie kann man eingeloggte Benutzerdaten aus einer Datenbanktabelle abrufen?

Ich denke, der beste Weg, dies zu tun wäre, die angemeldete Benutzer 'ID' anrufen, dann verwenden Sie es irgendwie, um die Zeile in der Datenbanktabelle, die ich will, aufzurufen? Dies ist

, wie weit ich habe, aber ich will nicht den ‚id‘ des Benutzers in der URL, ich will die ‚Reihe id‘ Benutzer in der Datenbanktabelle:

urls.py

url(r'^my-profile/(?P<id>[0-9]+)', my_profile, name="my_profile"), 

views.py

user = request.user 

Vorlage

<a href="{% url 'my_profile' id=user.id %}">My profile</a> 

Jede Hilfe wäre sehr willkommen!

Mein aktueller Code:

models.py

class BarSignUp(models.Model): 

     LOCATION_CHOICES=(
      ("Central London", "Central London"), 
      ("North London", "North London"), 
      ("East London", "East London"), 
      ("South London", "South London"), 
      ("West London", "West London"), 
     ) 

     user = models.ForeignKey(User, on_delete=models.CASCADE, null=True) 
     name = models.CharField(max_length=50) 
     bio = models.CharField(max_length=50) 
     area = models.CharField(max_length=50, choices=LOCATION_CHOICES, null=True) 
     booking_link = models.CharField(max_length=100, null=True) 
     timestamp = models.DateTimeField(auto_now_add=True, auto_now=False) 

     def __str__(self): 
      return self.email 

     def get_absolute_url(self): 
      return reverse("barber_profile", kwargs={"id": self.id}) 
+0

Was meinst du mit 'row id in der Datenbanktabelle'? –

+0

@GrzegorzOledzki In der mySQL-Tabelle möchte ich die Daten von dort sind zwei 'ID' Spalten, der Benutzer 'ID' und die Zeile 'ID'. Um die Benutzerdaten auf der Seite "Mein Profil" aufzurufen, muss ich die Zeile "ID" zur URL hinzufügen (z. B. my-profile/3).Zurzeit kann ich die 'id' des Benutzers leicht mit der 'user = request.user' Funktion oben zur URL hinzufügen, aber ich habe keine Ahnung, wie man das benutzt, um die relevanten Daten aufzurufen. –

+0

Die 'user.id' __IS__ die" row id "(Wert für das Primärschlüssel-DB-Feld" id "in Ihrer" django_user "-Tabelle) - aber Sie müssen es nicht von der Datenbank abrufen, es ist bereits in' request.user' vorhanden. –

Antwort

0

Ihr BarSignUp Modell hat ein ForeignKey auf User, die Sie bedeuten Null haben können, ein oder viele (für die größte mögliche Definition von „viele“ - buchstäblich Millionen sein könnte) von BarSignUp einen bestimmten Benutzer verknüpften Datensätze. Wenn das wirklich das ist, was Sie wollen, dann gibt request.user.barsignup_set.all() sie alle zurück (vgl. the FineManual).

Wenn das, was Sie wollen einen einzigen BarSignUp pro Benutzer ist, dann wollen Sie ein OneToOne Feld anstelle eines ForeignKey, und wenn Sie Ihre Modelle aktualisiert haben, können Sie die aktuelle erhalten angemeldete Benutzer BarSignUp mit request.user.barsignup (this is document too)

+0

anrufen Danke für diesen Bruno. Das sieht eher so aus. Wie würde ich 'request.user.barsignup_set.all()' in meiner Ansicht und in meiner Vorlage implementieren? Bitte kannst du ein Beispiel geben? Wäre es in etwa so: views.py 'data = request.user.barsignup_set.all()' template '{{data}}'? –

+0

Dies ist alles dokumentiert, also bitte beginnen Sie mit dem Dokument und Tutorial, versuchen Sie, Ihr Projekt von hier aus zu codieren, und kommen Sie zurück, wenn Sie einen Roadblock treffen. Aber beginne einfach mit dem Code in deinem Kommentar und finde heraus, was du bekommst ... –

+0

Danke für deine Hilfe. Ich fragte, weil views.py 'data = request.user.barsignup_set.all()' template '{{data}}' nicht funktionierte. Wäre hilfreich, wenn Sie mir sagen könnten, wo/wie ich hier falsch liege –

1

Wie Sie bereits wissen, können Sie die angemeldeten Benutzer mit request.user bekommen. Daher können Sie die ID aus der Regex entfernen und r'^my-profile/$' verwenden.

Dann ändern Sie Ihre URL-Tag zu {% url 'my_profile' %}.

+0

Ok danke, das ist viel einfacher! Das hilft mir jedoch immer noch nicht, Daten aus der Tabelle aufzurufen, die ich mit der 'id' des Benutzers verwenden möchte. Ich kann die Benutzer-ID in der Vorlage mit {{user.id}} anzeigen, aber wie rufe ich Daten aus einer anderen Datenbank mit Benutzerinformationen auf? Zum Beispiel {{database_i_want_to_query: name}} –

+0

Alasdair, entschuldige bitte nicht, dass ich klar genug war: Die Daten, die ich anrufen möchte, sind nicht in der Tabelle 'django_user'. Es ist in einer separaten Tabelle zu den Benutzerinformationen. Weißt du, wie man das löst? –

+0

Sie haben Ihre Modelle nicht angezeigt, sodass wir nicht wissen, wie sie abgefragt werden sollen. – Alasdair

0

Fremdschlüssel ist eine Viele-zu-eins-Beziehung. Wenn Sie also auf alle angemeldeten BarSignUp-Benutzer zugreifen möchten, sollten Sie Folgendes tun.

views.py

signups = request.user.barsignup_set.all() 

Vorlage

{% for barsignup in signups %} 
    {{ barsignup }} 
    {{ barsignup.field }} 
{% endfor %} 

Auch ist ein Fehler in Ihnen BarSignUp str Methode, bitte gleich korrigieren.

def __str__(self): 
    return self.user.email #if you want to display user email 
+0

Danke dafür. Ich habe es versucht, bekomme aber den Fehler: "'User' Objekt hat kein Attribut 'BarSignUp_set'". Dies ist, was mein Code wie folgt aussieht: 'def Profil (Anfrage): user = request.user signups = request.user.BarSignUp_set.all() context = { "signups": signups, } return machen (request "profile.html", {}) '' template {% für BarSignUp in% signups } {{BarSignUp }} {{BarSignUp.name }} {% endfor%} ' –

+0

Verwendung barsignup_set anstelle von BarSignUp_set (Problem mit dem Fall) - Um auf eine umgekehrte Beziehung zu verweisen, müssen Sie die Kleinschreibung des Modellnamens verwenden. In Ihrem Fall wird es also signups = request.user.barsignup_set.all() –

Verwandte Themen