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.
-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.
・ Python 3.8.2 ・ Django 3.0.3 ・ Le système d'exploitation est à la fois Windows 10 et macOS
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.
-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
[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>
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