[PYTHON] [Django-Memo] Ich möchte die angemeldeten Benutzerinformationen im Voraus im Formular festlegen.

Was du machen willst

Wenn Sie einen neuen Beitrag auf der Veröffentlichungsseite veröffentlichen, anstatt Ihren eigenen Namen einzugeben, möchten Sie die Informationen des angemeldeten Benutzers (z. B. Ihren Namen) im Voraus im Formular festlegen und sich die Mühe ersparen, Ihren Namen einzugeben.

1. Bereiten Sie das Modell vor

app/models.py


from django.db import models
from django.contrib.auth import get_user_model


class Post(models.Model):
    author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    content = models.TextField()

    def __str__(self):
        return self.title

Bereiten Sie ein Post-Modell vor und richten Sie drei Felder ein [Poster, Titel, Inhalt]. Das get_user_model () vonauthor = models.ForeignKey (get_user_model (), on_delete = models.CASCADE)ruft die gesamte Klasse des aktuell angemeldeten Benutzers auf, und diese eine Zeile ruft das Feld author und den angemeldeten Benutzer auf. Gebunden. Es gibt verschiedene Möglichkeiten, auf das Benutzermodell zu verweisen, es ist jedoch nicht sinnvoll, direkt auf das Benutzermodell zu verweisen. Referenz: https://djangobrothers.com/blogs/referencing_the_user_model/

2. Bereiten Sie das Formular vor.

app/forms.py


from django import forms
from .models import Post

class PostForm(forms.ModelForm):
    class Meta():
        model = Post
        fields = (
            'title',
            'content',
        )

Dieses Mal habe ich ein Modellformular verwendet. Erstellen Sie eine PostForm-Klasse, indem Sie ModelForm erben, das in forms.py von Django enthalten ist. Geben Sie das zu vererbende Modell mit "model = Post" an und geben Sie zwei Felder außer "author" an. Es ist nicht nötig, den Autor hier anzugeben.

3. Legen Sie den angemeldeten Benutzer in der Ansicht fest

app/views.py


from django.shortcuts import render, redirect
from .models import Post
from . import forms

def form_view(request):
    if request.method == 'POST':
        form = forms.PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.save()
            return redirect('sns:index')
    else:
       form = forms.PostForm()
    return render(request, 'sns/form_view.html', {'form': form})

In der Funktion form_view muss das Verhalten geändert werden, je nachdem, ob POST als Anforderung (if request.method == 'POST':) oder GET (else:) empfangen wird. Wenn beispielsweise die Schaltfläche "Neuer Beitrag" gedrückt wird und die Funktion form_view vom URL-Dispatcher aufgerufen wird, wird die Anforderung zu "GET", sodass der Vorgang des einfachen Anzeigens des Formulars wie unten gezeigt ausgeführt wird.

    else:
        form = forms.PostForm()
    return render(request, 'app/form_view.html', {'form': form})

Wenn etwas in das angezeigte Formular eingegeben wird, die Senden-Schaltfläche gedrückt wird und die Funktion form_view vom URL-Dispatcher aufgerufen wird, wird die Anforderung zu 'POST', sodass der unten gezeigte Code ausgeführt wird.

    if request.method == 'POST':
        form = forms.PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.save()
            return redirect('app:index')
  1. Speichern Sie die von form = forms.PostForm (request.POST) eingegebenen Informationen im Formular.
  2. Überprüfen Sie, ob die mit "if form.is_valid ():" eingegebenen Informationen korrekt sind, und speichern Sie "form" mit "post = form.save (commit = False)". Setzen Sie zu diesem Zeitpunkt im Argument commit = False und teilen Sie mit, dass es vor dem vollständigen Speichern etwas mehr geändert wird.
  3. Geben Sie in "post.author = request.user" den "Benutzer" (dh den angemeldeten Benutzer) an, der im Feld "Autor" des Beitrags "Anfrage" war.
  4. Speichern Sie den im Formular eingegebenen Inhalt mit "post.save ()" und dem angemeldeten Benutzernamen.
  5. Geben Sie das Umleitungsziel mit "return redirect ('app: index')" an.

Recommended Posts

[Django-Memo] Ich möchte die angemeldeten Benutzerinformationen im Voraus im Formular festlegen.
Übergeben Sie Login-Benutzerinformationen, um sie in Django anzuzeigen
Setzen Sie DateField des Formulars in Django auf type = date
[Linux] Ich möchte das Datum wissen, an dem sich der Benutzer angemeldet hat
Ich möchte die Django Debug Toolbar in Ajax-Anwendungen verwenden
Ich möchte Datetime.now in Djangos Test reparieren
Ich möchte DB-Informationen in einer Liste speichern
Ich möchte den Fortschritt in Python anzeigen!
Ich möchte einen Lebenszyklus in der Aufgabendefinition von ECS festlegen
Ich möchte in der Django-Verschiebungstabelle scrollen, aber ...
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Ich möchte R-Datensatz mit Python verwenden
Ich möchte eine Fehlermeldung auf Japanisch mit dem Django-Passwortänderungsformular ausgeben
So aktualisieren Sie Benutzerinformationen bei der Django RemoteUserMiddleware-Anmeldung
Ich möchte Betriebsinformationen über die Yahoo-Route erhalten
[Django] Ich möchte mich nach einer neuen Registrierung automatisch anmelden
Ich kann mich mit Django 3 nicht auf der Admin-Seite anmelden
Ich möchte den Wörterbuchtyp in der Liste eindeutig machen
Ich möchte die gültigen Zahlen im Numpy-Array ausrichten
Ich wollte den AWS-Schlüssel nicht in das Programm schreiben
LINEbot-Entwicklung möchte ich den Betrieb in der lokalen Umgebung überprüfen
Ich möchte die zweite Zeile zum Spaltennamen in Pandas machen
Ich möchte den G-Test in einem Monat Tag 1 bestehen
Ich möchte die Bevölkerung jedes Landes der Welt kennenlernen.
Ich möchte Spyder an die Taskleiste anheften
Beachten Sie, dass Sie die im Django-Vorlagenformular übergebenen Parameter Element für Element manuell dekorieren möchten
Ich möchte kühl auf die Konsole ausgeben
Ich möchte in der Einschlussnotation drucken
Ich möchte mit dem Reim Teil1 umgehen
Memo zur Informationsaufzeichnung mit Sitzung in Django
[C-Sprache] Ich möchte Zufallszahlen im angegebenen Bereich generieren
Ich möchte mit dem Reim part3 umgehen
Ich möchte das Ergebnis von "Zeichenfolge" .split () in Python stapelweise konvertieren
Ich möchte die abstrakte Klasse (ABCmeta) von Python im Detail erklären
Ich möchte eine Liste in der Reihenfolge anderer Listen sortieren
Ich möchte komplizierte vier Regeln in der IF-Anweisung der Django-Vorlage verwenden! → Verwenden Sie eine benutzerdefinierte Vorlage
Ich möchte den Fortschrittsbalken anzeigen
Ich möchte einen beliebigen Befehl im Befehlsverlauf von Shell belassen
Ich möchte Matplotlib in PySimpleGUI einbetten
Benutzerinformationen usw. in das Django-Protokoll ausgeben
Ich möchte mit dem Reim part2 umgehen
Ich möchte mit dem Reim part5 umgehen
Ich möchte mit dem Reim part4 umgehen
Ich möchte eine API erstellen, die ein Modell mit einer rekursiven Beziehung im Django REST Framework zurückgibt
Ich möchte visualisieren, wo und wie viele Leute in der Fabrik sind
Ich möchte Python in der Umgebung von pyenv + pipenv unter Windows 10 verwenden
Ich möchte eine Liste der WebDAV-Dateien im Modul Anfragen anzeigen
Ich möchte die Ergebnisse von% time, %% time usw. in einem Objekt (Variable) speichern.
Ich möchte den Dateinamen, die Zeilennummer und den Funktionsnamen in Python 3.4 erhalten
django geodjango Ich habe mich darauf bezogen, als ich im Tutorial feststeckte (Bearbeitung)
Ich möchte Dunnetts Test in Python machen
Ich möchte mit Python ein Fenster erstellen
Ich möchte mit dem Reim part7 (BOW) umgehen
Ich möchte verschachtelte Dicts in Python zusammenführen
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich möchte die Aktivierungsfunktion Mish verwenden
Ich möchte eine Django-App auf Heroku hochladen
Ich möchte die Standortinformationen von GTFS Realtime auf Jupyter zeichnen! (Mit Ballon)
Ich möchte mit swagger-codegen in Sekundenschnelle einen Mock-Server für Python-Flask einrichten.