[PYTHON] [Django] Ajout d'une nouvelle fonction de création de questions à l'application de sondages

Je souhaite ajouter des fonctionnalités après avoir créé une application de vote avec la documentation officielle de Django

Après avoir appris le mécanisme du framework selon le Document officiel Django, je voudrais ajouter des fonctions et essayer de l'implémenter. Je l'ai fait.

introduction

-Dans la documentation officielle de Django, vous pouvez toucher et apprendre Django tout en créant une application de vote simple à partir de zéro.

・ J'ai essayé de toucher Django pour la première fois dans le document officiel de Django, mais j'ai senti que l'explication n'était pas polie pour les débutants, j'ai donc arrêté d'apprendre dans ce tutoriel au milieu de la création de l'application, et [du matériel didactique de Django d'Udemy](https: / J'ai décidé d'apprendre les bases des bases sur /www.udemy.com/course/django-3app/) (celui que j'ai cherché sur Django et vendu le mieux).

・ Après avoir appris les bases de Django avec le matériel pédagogique d'Udemy, je suis retourné au document officiel et j'ai terminé la création de l'application de vote.

environnement

・ Python 3.8.2 ・ Django 3.0.3 ・ Le système d'exploitation est à la fois Windows 10 et macOS

Créer des fonctions supplémentaires (créer de nouvelles questions et choix)

Les applications de vote créées avec la documentation officielle doivent utiliser l'écran de l'utilisateur administrateur pour ajouter des questions et des choix. Je voudrais également ajouter un nouvel écran de création sur l'écran général de l'utilisateur.

Méthode de mise en œuvre

-Mise en œuvre avec CreateView ・ Créez un lien vers la page de création de questions sur la page de liste de questions · Commencez par créer une nouvelle question dans le tableau des questions ・ Après cela, créez une nouvelle option liée à la question

Image complète

image.png

code

[views.py]

polls/views.py


#importation omise

#réduction

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) La raison pour laquelle le nom du modèle n'a pas été décrit comme "template_name = (nom d'écran arbitraire) .html" (commenté) est Si vous définissez le nom d'écran sur "nom du modèle \ _form.html", CreateView et l'écran seront automatiquement liés.

(2) S'il n'y a qu'une seule colonne à spécifier dans les champs, une virgule (,) est requise après le nom de la colonne.

③ La chose la plus gênante est «Choice Create» Que fait "dispatch"? Remplacer la méthode de classe View existante dispatch.

Puisque le choix doit être associé à la question, question_id est spécifié dans dispatch.

Fondamentalement, on considère qu'il existe de nombreux cas où la forme telle que def XXXX (): est remplacée dans la vue à usage général (CreateView etc.). (J'admets l'objection ...)

Si vous êtes intéressé, veuillez vous référer à la définition de la vue générale.

[urls.py]

polls/urls.py


#importation omise

app_name = 'polls'
urlpatterns = [

    #Omis car il s'agit du même que le document officiel

    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

Ajoutez ʻauto_now_add = True` au deuxième argument de pub_date.

[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>

Ajoutez un lien vers l'écran de création de nouvelles questions sur la dernière ligne.

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>

finalement

Merci d'avoir regardé jusqu'au bout! Puisque cet article était mon premier article sur Qiita, je pense qu'il y avait beaucoup de choses qui n'ont pas fonctionné, mais j'espère que cela aidera ceux qui ont du mal à ajouter des fonctions similaires. J'ai mis un certain temps à mettre en œuvre cela. .. ..

Fondamentalement, la vue à usage général correspond à un modèle. Étant donné que cette application doit ajouter du nouveau contenu aux deux tableaux, nous avons mis en œuvre la création de questions et la création de choix séparément.

Je voulais vraiment créer une question et les options associées sur un seul écran, mais je ne pouvais pas l'implémenter avec ma technologie actuelle. Cela a peut-être été possible en rejoignant les tables de questions et de choix, mais ...

Cette fois, j'ai ajouté une nouvelle fonction de création, mais j'envisage également d'ajouter d'autres fonctions d'édition / suppression. Si je peux me le permettre, je le posterai sur Qiita.

Si vous avez des suggestions ou des questions, n'hésitez pas à contacter @ hiyoku0918!

Recommended Posts

[Django] Ajout d'une nouvelle fonction de création de questions à l'application de sondages
Tutoriel Django (Créer une application de blog) ⑤ --Fonction de création d'article
Ajout de la fonction de réussite à Sublime Text
Ajout d'une fonction pour enregistrer les décalages souhaités dans la table des décalages Django
Tutoriel Django (Créer une application de blog) ④ --Test d'unité
Fonction de création de données de décalage de table Django terminée
Fonction de création de quart de travail Django Ajout de la fonction d'enregistrement de travail de base pendant des jours
Tutoriel Django (Créer une application de blog) ① --Préparation, Création de la première page
J'ai ajouté une fonction à CPython (opérateur ternaire)
Comment développer une application de panier avec Django
Tutoriel Django (Créer une application de blog) ③ --Affichage de la liste d'articles
Jusqu'à ce que vous créiez une nouvelle application dans Django
Tutoriel Django (Créer une application de blog) ⑦ --Front End Complete
Je souhaite télécharger une application Django sur heroku