[Python] Dépannage des débutants tout en étudiant l'application Web de Django

1. À propos de cet article

Aperçu

J'ai fait un rappel de ce que je me suis fait prendre en étudiant le développement d'applications Web de Django.

Contenu

J'ai étudié selon ce tutoriel. https://eiry.bitbucket.io/

※※ Étant donné que le contenu est "Débutant", cela peut ne pas sonner pour ceux qui se sont familiarisés avec Django et d'autres applications Web dans une certaine mesure.

2. Outils / environnement utilisés

environnement ・ Windows10 ・ Python 3.8.0 ・ Cadre Web: django 2.2.5 ・ DB: sqlite3.30.1

outil ・ Pycharm


3. Dépannage

(A) La couleur du texte dans la balise d'entrée __HTML et la balise textarea devient blanche.

(1) Phénomène

Réglages

Spécifiez les formulaires dans forms.py comme suit

forms.py


from django import forms

from .models import Posting


class PostingForm(forms.ModelForm):
    class Meta:
        model = Posting
        fields = ('name', 'message')
        widgets = {
            'name': forms.TextInput(attrs={'size': 40, 'required': True}),
            'message': forms.Textarea(attrs={'cols': 80, 'rows': 20, 'required': False})
        }

Transmettez les informations du formulaire à index.html dans views.py comme suit.

Partie de vues



def index(request):
    """Affichage de processus / post"""
    #ModelForm et Form sont utilisés de la même manière lors de la création d'une instance
    form = PostingForm(request.POST or None)
    if request.method == 'POST':
        #Faux si aucun
        if form.is_valid():
            # save()Appelez simplement la méthode et elle sera enregistrée dans la base de données en utilisant Model.
            form.save()
            #Utilisez la structure de message pour informer l'utilisateur que le processus a réussi
            messages.success(request, 'Le message a été accepté.')
            return redirect('guestboard:index')
        else:
            #Utilisez la structure de message pour informer les utilisateurs que le traitement a échoué
            messages.error(request, 'Il y a une erreur dans le contenu d'entrée.')
    page = _get_page(
        Posting.objects.order_by('-id'),  #Obtenez les articles triés par ordre chronologique
        request.GET.get('page'),  #Obtenir le numéro de page à partir de la requête GET
        count=3
    )
    contexts = {
        'form': form,
        'page': page,
    }
    return render(request, 'guestboard/index.html', contexts)

Le contenu de index.html est comme ça. Développez les données du formulaire avec {{field.label_tag}} et {{field}} respectivement.

Partie de l'index


    <form action="{% url 'guestboard:index' %}" method="post">
        <div class="row">
            {% for field in form %}
                <div class="form-group">
                    {% if field.errors %}
                        <div class="col-sm-10">
                            <span class="col-sm-10">{{ field.errors }}</span>
                        </div>
                    {% endif %}
                    <div class="col-sm-10 ">
                        <label class="col-sm-3 control-label ">{{ field.label_tag }}</label>
                        <label class="label col-sm-7 ">{{ field }}</label>
                    </div>
                </div>
            {% endfor %}
            <div class="col-sm-10">
                <div class="form-group">
                    <label class="col-sm-2 control-label"><input type="submit" class="btn btn-primary"
                                                                 value="enregistrement"></label>
                    {% csrf_token %}
                </div>
            </div>
        </div>
    </form>

css utilise bootstrap 3.3.5 et une feuille auto-créée.

        <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
        <link rel="stylesheet" href="{% static 'css/common.css' %}">

Difficulté

Essayez de configurer un serveur de test. ** Ensuite, les caractères de la zone de saisie deviendront blancs et deviendront invisibles comme indiqué ci-dessous. ** **

Ci-dessous, j'écris dans les champs nom et message. コメント 2020-01-19 145606.png

Inversé et enfin visible コメント 2020-01-19 145620.png

(2) Conclusion

Tout d'abord, les deux points suivants.

-Le paramètre par défaut de bootstrap 3.3.5 était mauvais (?). ・ Après avoir changé mon propre CSS, "Super Reload" était nécessaire.

(3) Dépannage

3-1 Tout d'abord, j'ai ouvert les outils de développement Chrome et enquêté.

コメント 2020-01-19 151440.png

Regardez la colonne de la feuille de style.

コメント 2020-01-19 151549.png

Ensuite, j'ai pu confirmer que les paramètres par défaut pour la zone de texte de bootstrap étaient appliqués. Les caractères apparaissent lorsque cette option est désactivée pour vérification. コメント 2020-01-19 151813.png

J'ai donc décidé de l'écraser avec mon propre fichier CSS.

3-2 Défini comme suit dans le dossier de stockage de fichiers statiques de Django. Définition d'un sélecteur text_change_color afin qu'il puisse être appliqué aux éléments enfants.

common.Fait partie de css



.text_change_color {
    color: black !important;
}

.text_change_color * {
    color: black !important;
}

Index.html modifié.

index.Fait partie de html


                    <div class="col-sm-10 text_change_color">
                        <label class="col-sm-3 control-label ">{{ field.label_tag }}</label>
                        <label class="label col-sm-7 ">{{ field }}</label>
                    </div>

J'ai lancé une application Web avec ceci, Les lettres étaient toujours blanches.

コメント 2020-01-19 145606.png

3-3 Quand j'étais méfiant et que je regardais le contenu de css avec les outils de développement, Les changements n'ont pas été reflétés. コメント 2020-01-19 152507.png

Le redémarrage de l'application ne change pas la situation.

Après de nombreuses recherches, j'ai trouvé que je devais faire un "super rechargement" pour initialiser le cache. Référence: https://qiita.com/shati-taro/items/3946d3962071a26ebcb6

** Lorsque j'ai fait un super rechargement, il a été reflété en toute sécurité et j'ai pu confirmer que les caractères dans la zone de saisie devenaient correctement noirs. ** **


(B) La valeur de temps du DB enregistré avec __auto_now_add ne reflète pas TIMEZONE

~~ ### (1) Phénomène ~~ ~~ #### Paramètres ~~ ~~ Définissez le modèle de publication comme suit. ~~ ~~ Pour spécifier la date et l'heure d'enregistrement, définissez l'argument "auto_now_add" de DateTimeField sur True ~~ ~~ Réglez la date et l'heure du système à enregistrer. ~~



#### **`models.Partie de py`**
```py

from django.db import models


class Posting(models.Model):
    name = models.CharField(
        max_length=64,
        verbose_name='Nom',
        help_text='<b>Veuillez saisir votre nom</b>',
    )
    message = models.CharField(
        max_length=255,
        verbose_name='message',
        help_text='<u>Veuillez saisir un message</u>',
    )
    created_at = models.DateTimeField(
        auto_now_add=True,
        verbose_name='Date d'enregistrement',
    )

```



 ~~ En outre, spécifiez le FUSEAU HORAIRE comme Asie / Tokyo (heure standard japonaise) dans le réglage et py. ~~
 TIMEZONE activé comme ~~ USE_TZ = True. ~~

TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_L10N = True

USE_TZ = True

Lorsque vous appuyez sur le bouton d'enregistrement sur la page d'index ~~, chaque donnée de modèle est enregistrée en tant qu'enregistrement dans le DB. ~~

 ~~ #### Problème ~~
 ~~ Configurer un serveur de test dans les conditions ci-dessus ~~
 ~~ Dans votre propre temps PC [vers 18/01/2020 17:35] ~~
 ~~ Tapez le message "767675467" ~~
 ~~ Appuyez sur le bouton d'enregistrement à l'écran. ~~

~~ Pour confirmer que les données ont été enregistrées ~~ ~~ Ouvrez la fenêtre de l'outil de base de données sur Pycharm ~~ ~~ Vérifiez le contenu. ~~

 ~~ ** Ensuite, il est enregistré à l'heure UTC. ** ~~

~~![Commentaire 2020-01-19 155649.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541790/9f2cd4b5-c8d8-0b5d-0d79-d08c5cd6ea99 .png) ~~

 ~~ Pourquoi l'option TIMEZONE devrait-elle être activée? ?? ~~
 ~~ (Je suis assez inquiet que le nom de la colonne soit déformé) ~~

~~ ### (2) Conclusion ~~ ~~ En conclusion ~~ C'était la spécification de Django concernant la génération de données de modèle lorsque ~~ auto_now_add était spécifié. ~~ ~~ Les fuseaux horaires et ainsi de suite sont gérés par Django. ~~

 ~~ ### (3) Dépannage ~~
~~####3-1~~
 ~~ Pour le moment, j'ai vérifié si les données à l'écran étaient cohérentes avec la date et l'heure d'enregistrement de la base de données. ~~
 Ensuite, il peut être affiché à l'écran en heure standard japonaise. ~~

~~![Commentaire 2020-01-19 160228.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541790/34ec29c9-3849-457a-5b0b-d157531506bf .png) ~~

 ~~ Apparemment, vous devez lire le code dans le champ DateTimeField. ~~

~~####3-2~~ Le constructeur de ~~ DateField (classe parente de DateTimeField) ressemble à ceci. ~~



#### **`python`**
```py


class DateField(DateTimeCheckMixin, Field):
    empty_strings_allowed = False
    default_error_messages = {
        'invalid': _("'%(value)s' value has an invalid date format. It must be "
                     "in YYYY-MM-DD format."),
        'invalid_date': _("'%(value)s' value has the correct format (YYYY-MM-DD) "
                          "but it is an invalid date."),
    }
    description = _("Date (without time)")

    def __init__(self, verbose_name=None, name=None, auto_now=False,
                 auto_now_add=False, **kwargs):
        self.auto_now, self.auto_now_add = auto_now, auto_now_add
        if auto_now or auto_now_add:
            kwargs['editable'] = False
            kwargs['blank'] = True
        super().__init__(verbose_name, name, **kwargs)
```

 Si ~~ auto_now_add vaut True, il semble que editable soit passé à la classe parente comme False. ~~
 ~~ Je n'ai pas semblé obtenir d'informations utiles même si je regardais ici ~~
 J'ai regardé la méthode ~~ pre_save (la méthode qui est exécutée lorsque le modèle est enregistré). ~~



#### **`pre_save`**
```py

    def pre_save(self, model_instance, add):
        if self.auto_now or (self.auto_now_add and add):
            value = timezone.now()
            setattr(model_instance, self.attname, value)
            return value
        else:
            return super().pre_save(model_instance, add)

```



 Lorsque ~~ auto_now_add vaut True, timezone.now () est appelé. ~~
 ~~ Le contenu est ... ~~


```py
def now():
    """
    Return an aware or naive datetime.datetime, depending on settings.USE_TZ.
    """
    if settings.USE_TZ:
        # timeit shows that datetime.now(tz=utc) is 24% slower
        return datetime.utcnow().replace(tzinfo=utc)
    else:
        return datetime.now()

```


 ~~ Si l'utilisation du fuseau horaire spécifié dans settings.py est valide ou non ~~
 La valeur à renvoyer ~~ semble être celle de UTC. ~~

~~ Hmm? ~~ ~~ Mais l'heure standard japonaise peut être obtenue sur l'écran. ~~ ~~ Pourquoi? ~~

~~####3-3~~
 ~~ Je ne pouvais pas le supporter, alors j'ai cherché ~~
 ~~ J'ai trouvé l'article suivant. ~~

~~https://djangobrothers.com/blogs/django_datetime_localtime/~~

 ~~> Une chose à garder à l'esprit lorsque vous utilisez le django.utils.timezone de Django est qu'il n'est pas encore localisé lors de l'utilisation de datetime dans votre code. ~~
 ~~ C'est un peu déroutant, mais par exemple, jusqu'à ce qu'il soit affiché dans le modèle, il gère un objet datetime conscient basé sur les aigus, et lorsqu'il est affiché, il est converti à l'heure locale appropriée. .. ~~

~~ Si vous vous conformez à cette spécification, vous pouvez comprendre le comportement ci-dessus. ~~

 ~~ Il semble que Django convertit automatiquement TIME ZONE lors de la sortie à l'écran. ~~
 ~~ On ne sait pas avant quelle partie du code source il s'agit. ~~


 <font color = "Red"> Le document officiel dit qu'il est enregistré dans la base de données avec UTC </ font>
 <font color = "Red"> J'aurais dû le lire en premier </ font>
[https://docs.djangoproject.com/ja/2.1/topics/i18n/timezones/](https://docs.djangoproject.com/ja/2.1/topics/i18n/timezones/)



# 5. À la fin

 C'est le chemin vers la résolution de problèmes pour les débutants.
 Veuillez commenter si vous avez des suppléments.
 De plus, s'il y a quelque chose qui divulgue des informations personnelles
 Je vous serais reconnaissant si vous pouviez m'en dire un peu. (Mailto: [email protected])




Recommended Posts

[Python] Dépannage des débutants tout en étudiant l'application Web de Django
Framework Web Django Python
Les débutants en Python publient des applications Web à l'aide de l'apprentissage automatique [Partie 1] Introduction
Exercices Python pour les débutants # 2 [pour instruction / instruction while]
Premiers pas avec les applications Web Python
Web scraping pour les débutants en Python (1)
Web scraping pour les débutants en Python (4) -1
Migrer les applications Django exécutées sur Python 2.7 vers Python 3.5
Étudier Python
Explication facile à comprendre de l'application Web Python (Django) même pour les débutants (2) [Création de projet]
Les débutants en Python publient des applications Web à l'aide de l'apprentissage automatique [Partie 2] Introduction à Python explosif !!
Explication facile à comprendre de l'application Web Python (Django) même pour les débutants (1) [Construction de l'environnement]
[Pour les débutants] Essayez le web scraping avec Python
En étudiant JQuery et Python jusqu'à la publication d'un service Web sur GCP
La première application Web créée par des débutants en Python
Python Web Framework Django vs Pyramid vs Flask Décembre 2015
Débutants en Python accro à Django
Tutoriel Python Django (5)
Tutoriel Python Django (2)
[Python] Commencez à étudier
Tutoriel Python Django (8)
Tutoriel Python Django (6)
Les débutants pratiquent Python
Tutoriel Python Django (7)
Tutoriel Python Django (1)
Tutoriel du didacticiel Python Django
Note du débutant Python
Tutoriel Python Django (3)
Explication facile à comprendre de l'application Web Python (Django), même pour les débutants (6) [MTV design pattern completion]
Tutoriel Python Django (4)
Déployer des applications Web Python 3.6 / Django / Postgres sur Azure
Web scraping pour les débutants en Python (1) Version améliorée
python débutant essaie d'ajouter une authentification de base à l'administrateur de Django
[Débutant] [Python / Django] Un ingénieur Web débutant a essayé un didacticiel Django-Partie 7-
(Python) Essayez de développer une application Web en utilisant Django
[Débutant] [Python / Django] Un ingénieur Web débutant a essayé un didacticiel Django - Partie 1-
[Débutant] [Python / Django] Un ingénieur Web débutant a essayé un didacticiel Django - Partie 2
[Débutant] [Python / Django] Un ingénieur web débutant a essayé un didacticiel Django - Partie 0-
[Débutant] [Python / Django] Un ingénieur Web débutant a essayé un tutoriel Django - Partie 5
Scrapage Web rapide avec Python (tout en prenant en charge le chargement JavaScript)
[Débutant] [Python / Django] Un ingénieur Web débutant a essayé un tutoriel Django - Partie 6
Application Web réalisée avec Python3.4 + Django (Construction de l'environnement Part.1)
Les débutants en Python sont bloqués dans leur premier scraping Web
[Débutant] [Python / Django] Un ingénieur Web débutant a essayé un didacticiel Django - Partie 3
Scraping Web pour débutants avec Python (4) --2 Scraping sur Cloud Shell