[Python] Fehlerbehebung für Anfänger beim Studium der Webanwendung von Django

1. Über diesen Artikel

Überblick

Ich erinnerte mich daran, was ich beim Studium der Entwicklung von Webanwendungen in Django erwischt hatte.

Inhalt

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.

2. Verwendete Tools / Umgebung

Umgebung ・ Windows10 ・ Python 3.8.0 ・ Webframework: django 2.2.5 ・ DB: sqlite3.30.1

Werkzeug ・ Pycharm


3. Fehlerbehebung

(A) Die Textfarbe im __HTML-Eingabe- und Textbereich-Tag wird weiß.

(1) Phänomen

die Einstellungen

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' %}">

Ärger

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. コメント 2020-01-19 145606.png

Umgekehrt und endlich sichtbar コメント 2020-01-19 145620.png

(2) Schlussfolgerung

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) Fehlerbehebung

3-1 Zuerst habe ich die Chrome-Entwicklertools geöffnet und nachgeforscht.

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

Beobachten Sie die Stylesheet-Spalte.

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

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. コメント 2020-01-19 151813.png

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ß.

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

3-3 Als ich misstrauisch war und den Inhalt von CSS mit den Entwicklertools betrachtete, Die Änderungen wurden nicht berücksichtigt. コメント 2020-01-19 152507.png

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. ** ** **


(B) Der Zeitwert der mit __auto_now_add registrierten Datenbank spiegelt nicht die ZEITZONE wider

~~ ### (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

[Python] Fehlerbehebung für Anfänger beim Studium der Webanwendung von Django
Django Python Web Framework
Python-Anfänger veröffentlichen Web-Apps mithilfe von maschinellem Lernen [Teil 1] Einführung
Python-Übungen für Anfänger # 2 [für Anweisung / while-Anweisung]
Erste Schritte mit Python-Webanwendungen
Web Scraping für Anfänger in Python (1)
Web Scraping für Anfänger in Python (4) -1
Migrieren Sie Django-Anwendungen, die unter Python 2.7 ausgeführt werden, auf Python 3.5
Python studieren
Leicht verständliche Erklärung der Python-Webanwendung (Django) auch für Anfänger (2) [Projekterstellung]
Python-Anfänger veröffentlichen Web-Apps mit maschinellem Lernen [Teil 2] Einführung in explosives Python !!
Leicht verständliche Erklärung der Python-Webanwendung (Django) auch für Anfänger (1) [Umgebungskonstruktion]
[Für Anfänger] Versuchen Sie Web Scraping mit Python
Während des Studiums von JQuery und Python bis zur Veröffentlichung eines Webdienstes auf GCP
Die erste Web-App, die von Python-Anfängern erstellt wurde
Python Web Framework Django gegen Pyramide gegen Flasche Dezember 2015
Python-Anfänger süchtig nach Django
Python Django Tutorial (5)
Python Django Tutorial (2)
[Python] Beginne zu lernen
Python Django Tutorial (8)
Python Django Tutorial (6)
Anfänger üben Python
Python Django Tutorial (7)
Python Django Tutorial (1)
Python Django Tutorial Tutorial
Python-Anfängernotiz
Python Django Tutorial (3)
Leicht verständliche Erklärung der Python-Webanwendung (Django) auch für Anfänger (6) [Vervollständigung des MTV-Entwurfsmusters]
Python Django Tutorial (4)
Stellen Sie Python 3.6 / Django / Postgres-Webanwendungen in Azure bereit
Web Scraping für Anfänger in Python (1) Verbesserte Version
Python-Anfänger versucht, dem Administrator von Django eine grundlegende Authentifizierung hinzuzufügen
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 7-
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 1-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 2-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 0-
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 5-
Schnelles Web-Scraping mit Python (unterstützt das Laden von JavaScript)
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 6-
Webanwendung erstellt mit Python3.4 + Django (Teil.1 Umgebungskonstruktion)
Python-Anfänger bleiben beim ersten Web-Scraping stecken
[Anfänger] [Python / Django] Ein junger Webingenieur hat ein Django-Tutorial ausprobiert - Teil 3-
Web-Scraping für Anfänger mit Python (4) --2 Scraping auf Cloud Shell