Ich erinnerte mich daran, was ich beim Studium der Entwicklung von Webanwendungen in Django erwischt hatte.
Ich habe nach diesem Tutorial studiert. https://eiry.bitbucket.io/
※※ Da der Inhalt "Anfänger" ist, klingt er möglicherweise nicht für diejenigen, die sich in gewissem Maße mit Django und anderen Web-Apps vertraut gemacht haben.
Umgebung ・ Windows10 ・ Python 3.8.0 ・ Webframework: django 2.2.5 ・ DB: sqlite3.30.1
Werkzeug ・ Pycharm
Geben Sie die Formulare in forms.py wie folgt an
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})
}
Übergeben Sie die Formularinformationen wie folgt an index.html in views.py.
Teil der Ansichten
def index(request):
"""Prozessanzeige / Post"""
#ModelForm und Form werden beim Erstellen einer Instanz auf dieselbe Weise verwendet
form = PostingForm(request.POST or None)
if request.method == 'POST':
#Falsch, wenn keine
if form.is_valid():
# save()Rufen Sie einfach die Methode auf und sie wird mit Model in der DB registriert.
form.save()
#Verwenden Sie das Nachrichtenframework, um den Benutzer über den erfolgreichen Vorgang zu informieren
messages.success(request, 'Die Post wurde angenommen.')
return redirect('guestboard:index')
else:
#Verwenden Sie das Nachrichtenframework, um Benutzer zu benachrichtigen, dass die Verarbeitung fehlgeschlagen ist
messages.error(request, 'Es liegt ein Fehler im Eingabeinhalt vor.')
page = _get_page(
Posting.objects.order_by('-id'), #Holen Sie sich Beiträge in chronologischer Reihenfolge sortiert
request.GET.get('page'), #Seitenzahl aus GET-Abfrage abrufen
count=3
)
contexts = {
'form': form,
'page': page,
}
return render(request, 'guestboard/index.html', contexts)
Der Inhalt von index.html ist wie folgt. Erweitern Sie die Daten im Formular mit {{field.label_tag}} bzw. {{field}}.
Teil des 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="Anmeldung"></label>
{% csrf_token %}
</div>
</div>
</div>
</form>
CSS verwendet Bootstrap 3.3.5 und ein selbst erstelltes Blatt.
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
<link rel="stylesheet" href="{% static 'css/common.css' %}">
Versuchen Sie, einen Testserver einzurichten. ** Dann werden die Zeichen im Eingabefeld weiß und unsichtbar, wie unten gezeigt. ** ** **
Unten schreibe ich in die Felder Name und Nachricht.
Umgekehrt und endlich sichtbar
Zunächst die folgenden zwei Punkte.
-Die Standardeinstellung von Bootstrap 3.3.5 war schlecht (?). ・ Nach dem Ändern meines eigenen CSS war "Super Reload" erforderlich.
3-1 Zuerst habe ich die Chrome-Entwicklertools geöffnet und nachgeforscht.
Beobachten Sie die Stylesheet-Spalte.
Dann konnte ich bestätigen, dass die Standardeinstellungen für den Textbereich von Bootstrap angewendet wurden. Zeichen werden angezeigt, wenn dies zur Überprüfung deaktiviert ist.
Also habe ich beschlossen, es mit meiner eigenen CSS-Datei zu überschreiben.
3-2 Im statischen Dateispeicherordner von Django wie folgt definiert. Definierter text_change_color-Selektor, damit er auf untergeordnete Elemente angewendet werden kann.
common.Teil von CSS
.text_change_color {
color: black !important;
}
.text_change_color * {
color: black !important;
}
Geänderte index.html.
index.Ein Teil von 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>
Ich habe damit eine Web-App gestartet, Die Buchstaben waren immer noch weiß.
3-3 Als ich misstrauisch war und den Inhalt von CSS mit den Entwicklertools betrachtete, Die Änderungen wurden nicht berücksichtigt.
Ein Neustart der App ändert nichts an der Situation.
Nach vielen Recherchen stellte ich fest, dass ich ein "Super-Reload" durchführen musste, um den Cache zu initialisieren. Referenz: https://qiita.com/shati-taro/items/3946d3962071a26ebcb6
** Als ich ein Super-Reload durchgeführt habe, wurde es sicher wiedergegeben und ich konnte bestätigen, dass die Zeichen im Eingabefeld richtig schwarz wurden. ** ** **
~~ ### (1) Phänomen ~~ ~~ #### Einstellungen ~~ ~~ Definieren Sie das Buchungsmodell wie folgt. ~~ ~~ Um das Registrierungsdatum und die Registrierungszeit anzugeben, setzen Sie das Argument "auto_now_add" von DateTimeField auf True ~~ ~~ Stellen Sie das aktuelle Systemdatum und die aktuelle Uhrzeit für die Registrierung ein. ~~
#### **`models.Ein Teil von py`**
```py
from django.db import models
class Posting(models.Model):
name = models.CharField(
max_length=64,
verbose_name='Name',
help_text='<b>Bitte geben Sie Ihren Namen ein</b>',
)
message = models.CharField(
max_length=255,
verbose_name='Botschaft',
help_text='<u>Bitte geben Sie eine Nachricht ein</u>',
)
created_at = models.DateTimeField(
auto_now_add=True,
verbose_name='Eingetragenes Datum',
)
```
~~ Geben Sie außerdem TIME ZONE als Asia / Tokyo (japanische Standardzeit) in der Einstellung py an. ~~
TIMEZONE aktiviert als ~~ USE_TZ = True. ~~
TIME_ZONE = 'Asia/Tokyo'
USE_I18N = True
USE_L10N = True
USE_TZ = True
Wenn Sie auf der Indexseite ~~ auf die Schaltfläche Registrieren klicken, werden alle Modelldaten als Datensatz in der Datenbank registriert. ~~
~~ #### Ärger ~~
~~ Richten Sie einen Testserver unter den oben genannten Bedingungen ein ~~
~~ In Ihrer eigenen PC-Zeit [um 2020-01-18 17:35] ~~
~~ Geben Sie die Nachricht "767675467" ~~ ein
~~ Drücken Sie die Registrierungstaste auf dem Bildschirm. ~~
~~ Um zu bestätigen, dass die Daten registriert wurden ~~ ~~ Öffne das Datenbank-Tool-Fenster auf Pycharm ~~ ~~ Überprüfen Sie den Inhalt. ~~
~~ ** Dann wird es zur UTC-Zeit registriert. ** ~~
~~![Kommentar 2020-01-19 155649.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541790/9f2cd4b5-c8d8-0b5d-0d79-d08c5cd6ea99 .png) ~~
~~ TIMEZONE sollte aktiviert sein, warum? ?? ~~
~~ (Ich bin ziemlich besorgt, dass der Spaltenname verstümmelt ist) ~~
~~ ### (2) Schlussfolgerung ~~ ~~ Abschließend ~~ Es war Djangos Spezifikation bezüglich der Generierung von Modelldaten, als ~~ auto_now_add angegeben wurde. ~~ ~~ Zeitzonen usw. werden von Django verwaltet. ~~
~~ ### (3) Fehlerbehebung ~~
~~####3-1~~
~~ Vorerst habe ich überprüft, ob die Daten auf dem Bildschirm mit dem Registrierungsdatum und der Registrierungszeit der Datenbank übereinstimmen. ~~
Dann kann es in japanischer Standardzeit auf dem Bildschirm angezeigt werden. ~~
~~![Kommentar 2020-01-19 160228.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541790/34ec29c9-3849-457a-5b0b-d157531506bf .png) ~~
~~ Anscheinend musst du den Code im DateTimeField lesen. ~~
~~####3-2~~ Der Konstruktor von ~~ DateField (übergeordnete Klasse von DateTimeField) sieht folgendermaßen aus. ~~
#### **`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)
```
Wenn ~~ auto_now_add True ist, wird anscheinend editierbar als False an die übergeordnete Klasse übergeben. ~~
~~ Ich schien keine nützlichen Informationen zu bekommen, selbst wenn ich hier nachgesehen habe ~~
Ich habe mir die Methode ~~ pre_save angesehen (die Methode, die ausgeführt wird, wenn das Modell gespeichert wird). ~~
#### **`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)
```
Wenn ~~ auto_now_add True ist, wird timezone.now () aufgerufen. ~~
~~ Der Inhalt ist ... ~~
```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()
```
~~ Gibt an, ob die in settings.py angegebene Zeitzonenverwendung gültig ist oder nicht ~~
Der zurückzugebende Wert ~~ scheint der von UTC zu sein. ~~
~~ Hmm? ~~ ~~ Die japanische Standardzeit kann jedoch auf dem Bildschirm angezeigt werden. ~~ ~~ Warum? ~~
~~####3-3~~
~~ Ich konnte nicht damit umgehen, also habe ich es nachgeschlagen ~~
~~ Ich habe den folgenden Artikel gefunden. ~~
~~https://djangobrothers.com/blogs/django_datetime_localtime/~~
~~> Eine Sache, die Sie bei der Verwendung von Djangos django.utils.timezone beachten sollten, ist, dass sie bei Verwendung von datetime in Ihrem Code noch nicht lokalisiert ist. ~~
~~ Es ist etwas verwirrend, aber bis es in der Vorlage angezeigt wird, handelt es sich beispielsweise um ein UTC-basiertes bewusstes Datum / Uhrzeit-Objekt, und wenn es angezeigt wird, wird es in die entsprechende Ortszeit konvertiert. .. ~~
~~ Wenn Sie diese Spezifikation einhalten, können Sie das obige Verhalten verstehen. ~~
~~ Es scheint, dass Django die ZEITZONE bei der Ausgabe auf dem Bildschirm automatisch konvertiert. ~~
~~ Es ist unklar, welcher Teil des Quellcodes dies ist. ~~
<font color = "Red"> Das offizielle Dokument besagt, dass es mit UTC </ font> in der Datenbank registriert ist
<font color = "Red"> Ich hätte das zuerst lesen sollen </ font>
[https://docs.djangoproject.com/ja/2.1/topics/i18n/timezones/](https://docs.djangoproject.com/ja/2.1/topics/i18n/timezones/)
# 5. Am Ende
Dies ist der Weg zur Lösung von Problemen für Anfänger.
Bitte kommentieren Sie, wenn Sie Ergänzungen haben.
Auch wenn es etwas gibt, das persönliche Informationen verliert,
Ich würde es begrüßen, wenn Sie mir ein wenig sagen könnten. (Mailto: [email protected])
Recommended Posts