J'ai fait un rappel de ce que je me suis fait prendre en étudiant le développement d'applications Web de Django.
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.
environnement ・ Windows10 ・ Python 3.8.0 ・ Cadre Web: django 2.2.5 ・ DB: sqlite3.30.1
outil ・ Pycharm
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' %}">
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.
Inversé et enfin visible
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-1 Tout d'abord, j'ai ouvert les outils de développement Chrome et enquêté.
Regardez la colonne de la feuille de style.
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.
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.
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.
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. ** **
~~ ### (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