[PYTHON] [Django] Neue Funktion zum Erstellen von Fragen zur Umfrage-App hinzugefügt

Ich möchte Funktionen hinzufügen, nachdem ich eine Abstimmungs-App mit der offiziellen Dokumentation von Django erstellt habe

Nachdem ich den Mechanismus des Frameworks gemäß Official Django document kennengelernt habe, möchte ich eine Funktion hinzufügen und versuchen, sie zu implementieren. Ich habe es gemacht.

Einführung

・ In Djangos offiziellem Dokument können Sie Django berühren und lernen, während Sie eine einfache Abstimmungs-App von Grund auf neu erstellen.

・ Ich habe zum ersten Mal versucht, Django im offiziellen Dokument von Django zu berühren, aber ich hatte das Gefühl, dass die Erklärung für Anfänger nicht höflich war. Deshalb habe ich mitten in der Erstellung der Anwendung und [Udemys Django-Lehrmaterialien](https: /) aufgehört, in diesem Tutorial zu lernen Ich beschloss, die Grundlagen der Grundlagen unter /www.udemy.com/course/django-3app/) zu lernen (die, die ich auf Django gesucht und am besten verkauft habe).

・ Nachdem ich mit Udemys Unterrichtsmaterialien die Grundlagen von Django gelernt hatte, kehrte ich zum offiziellen Dokument zurück und schloss die Erstellung der Abstimmungs-App ab.

Umgebung

・ Python 3.8.2 ・ Django 3.0.3 ・ Das Betriebssystem ist sowohl Windows 10 als auch MacOS

Erstellen Sie zusätzliche Funktionen (erstellen Sie neue Fragen und Auswahlmöglichkeiten)

Abstimmungs-Apps, die mit offizieller Dokumentation erstellt wurden, müssen den Administrator-Benutzerbildschirm verwenden, um Fragen und Auswahlmöglichkeiten hinzuzufügen. Ich möchte auch einen neuen Erstellungsbildschirm auf dem allgemeinen Benutzerbildschirm hinzufügen.

Implementierungsmethode

-Implementieren mit CreateView ・ Erstellen Sie auf der Seite mit der Fragenliste einen Link zur Seite zur Erstellung von Fragen · Erstellen Sie zuerst eine neue Frage in der Fragentabelle ・ Erstellen Sie anschließend eine neue Option, die mit der Frage verknüpft ist

Vollständiges Bild

image.png

Code

[views.py]

polls/views.py


#Import weggelassen

#Kürzung

class QuestionCreate(CreateView):
    #template_name = 'polls/createquestion.html'
    model = Question
    fields = ('question_text',)
    success_url = reverse_lazy('polls:index')


class ChoiceCreate(CreateView):
    model = Choice
    fields = ('choice_text',)
    success_url = reverse_lazy('polls:index')

    def dispatch(self, request, *args, **kwargs):
        self.question = get_object_or_404(Question, pk=kwargs['question_id'])
        return super().dispatch(request, *args, **kwargs)

    def form_valid(self, form):
        form.instance.question = self.question
        return super().form_valid(form)

(1) Der Grund, warum der Name der Vorlage nicht als "Vorlagenname = (beliebiger Bildschirmname) .html" (auskommentiert) beschrieben wurde, ist Wenn Sie den Bildschirmnamen auf "Modellname \ _form.html" setzen, werden CreateView und der Bildschirm automatisch verknüpft.

(2) Wenn in Feldern nur eine Spalte angegeben werden muss, ist nach dem Spaltennamen ein Komma (,) erforderlich.

③ Das Problem ist "Choice Create" Was macht der Versand? Überschreiben der vorhandenen View-Klassenmethode dispatch.

Da die Auswahl mit der Frage verknüpft sein muss, wird question_id in "dispatch" angegeben.

Grundsätzlich wird davon ausgegangen, dass es viele Fälle gibt, in denen das Formular wie "def XXXX ():" in der Allzweckansicht (CreateView usw.) überschrieben wird. (Ich gebe den Einwand zu ...)

Wenn Sie interessiert sind, lesen Sie bitte die Definition der allgemeinen Ansicht.

[urls.py]

polls/urls.py


#Import weggelassen

app_name = 'polls'
urlpatterns = [

    #Ausgelassen, da es mit dem offiziellen Dokument identisch ist

    path('question_create/', views.QuestionCreate.as_view(),
        name='questioncreate'),

    path('<int:question_id>/choice_create/', views.ChoiceCreate.as_view(),
        name='choicecreate'),
]

[models.py]

polls/models.py



class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published', auto_now_add=True)

    def __str__(self):
        return self.question_text

Fügen Sie dem zweiten Argument von pub_date auto_now_add = True hinzu.

[templates]

polls/templates/polls/index.html


{% if latest_question_list %}
<ul>
    {% for question in latest_question_list %}
    <li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a>
    {% endfor %}
</ul>
{% else %}
<p>No polls are available.</p>
{% endif %}

<a href="{% url 'polls:questioncreate' %}">New Question</a>

Fügen Sie in der letzten Zeile einen Link zum Bildschirm zur Erstellung neuer Fragen hinzu.

polls/templates/polls/question_form.html



<form method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Save">
</form>

polls/templates/polls/choice_form.html



<form method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Save">
</form>

Schließlich

Danke, dass du bis zum Ende zugesehen hast! Da dieser Artikel mein erster Beitrag zu Qiita war, gab es viele Dinge, die nicht funktionierten, aber ich hoffe, er hilft denen, die Probleme haben, ähnliche Funktionen hinzuzufügen. Ich habe lange gebraucht, um dies umzusetzen. .. ..

Grundsätzlich entspricht die Allzweckansicht einem Modell. Da diese App den beiden Tabellen neuen Inhalt hinzufügen muss, haben wir die Erstellung von Fragen und Auswahlmöglichkeiten separat implementiert.

Ich wollte unbedingt eine Frage und die zugehörigen Optionen auf einem Bildschirm erstellen, konnte sie jedoch mit meiner aktuellen Technologie nicht implementieren. Es wäre möglich gewesen, wenn die Fragen- und Auswahltabellen zusammengefügt worden wären, aber ...

Dieses Mal habe ich eine neue Erstellungsfunktion hinzugefügt, aber ich denke auch darüber nach, andere Bearbeitungs- / Löschfunktionen hinzuzufügen. Wenn ich es mir leisten kann, werde ich es auf Qiita veröffentlichen.

Wenn Sie Vorschläge oder Fragen haben, wenden Sie sich bitte an @ hiyoku0918!

Recommended Posts

[Django] Neue Funktion zum Erstellen von Fragen zur Umfrage-App hinzugefügt
Django Tutorial (Blog-App erstellen) ⑤ - Artikelerstellungsfunktion
Leistungsfunktion zu Sublime Text hinzugefügt
Es wurde eine Funktion hinzugefügt, um gewünschte Verschiebungen in der Django-Verschiebungstabelle zu registrieren
Django Tutorial (Blog App erstellen) ④ --Einheitentest
Django Shift Table Shift Datenerstellungsfunktion abgeschlossen
Django-Schichterstellungsfunktion Grundlegende Arbeitsschichtregistrierungsfunktion für Tage hinzugefügt
Django Tutorial (Blog App erstellen) ① - Vorbereitung, Erstellung der obersten Seite
Ich habe CPython (ternärer Operator) eine Funktion hinzugefügt.
So entwickeln Sie eine Cart-App mit Django
Django Tutorial (Blog App erstellen) ③ - Artikellistenanzeige
Bis Sie eine neue App in Django erstellen
Django Tutorial (Blog App erstellen) ⑦ --Front End Complete
Ich möchte eine Django-App auf Heroku hochladen