Mein eigener Twitter-Client mit Django beim letzten Mal erstellt http://qiita.com/Gen6/items/11fa5265053da95fcf0b,
Nachdem ich dies getan habe, möchte ich eine einfache Aufgabenlistenanwendung mit SQLite erstellen. Ich habe versucht, die Konfiguration so einfach wie möglich zu gestalten, um Raum für Anpassungen zu lassen. Gibt es Raum für Änderungen, z. B. das Senden einer Antwort von der Aufgabenliste an mich auf Twitter?
Dieses Mal werde ich es mit Djangos Formular schaffen. Wenn ich das verstehen kann, habe ich das Gefühl, dass das Angebot an einfachen Kundenverwaltungssystemen, Bulletin Boards, SNS-ähnlichen Anwendungen usw. dramatisch erweitert wird.
Im folgenden Artikel erfahren Sie zunächst, wie Sie mit Django beginnen. http://qiita.com/Gen6/items/1848f8b4d938807d082e
Wir gehen davon aus, dass Python 3 und Django bereits installiert sind und virtualenv ebenfalls installiert ist. Wenn Sie noch nicht bereit sind, bereiten Sie sich bitte auf die früheren Artikel vor.
Lassen Sie uns die Django-Projektbestellungen vornehmen und myapp darunter erstellen.
virtualenv) $ django-admin startproject orders
virtualenv) $ cd orders
virtualenv) $ python manage.py startapp myapp
Stellen Sie sicher, dass myapp und Bestellungen im Auftragsverzeichnis erstellt werden.
Bitte beschreiben Sie den Inhalt von settings.py unter Bezugnahme auf Folgendes. Verwenden Sie SQLite3 wie für die Datenbank.
orders/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates'),],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, "static"),
)
url.py
orders/urls.py
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^myapp/', include('myapp.urls')),
url(r'^', include('myapp.urls',namespace='myapp')),
url(r'^admin/', admin.site.urls),
]
Dies wird später durch Festlegen des Namespace erleichtert. Ich denke, es ist eine gute Idee, sich angewöhnen, einen Namespace hinzuzufügen.
myapp/ursl.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
]
Diesmal ist es eine einfache Aufgabenliste, aber wir werden die in Django integrierten Formulare nutzen, um das Modell grob zu definieren. models.DateTimeField () ist nützlich.
myapp/models.py
from django.db import models
class Posting(models.Model):
message = models.CharField(
max_length = 140,
verbose_name = 'Dinge die zu tun sind',
)
created_at = models.DateTimeField(
auto_now_add = True,
verbose_name= 'Datum (und Uhrzeit',
)
Wir erhalten den Text, was zu tun ist, und Datum und Uhrzeit werden automatisch geschrieben. Ich habe versucht, bis zu 140 Zeichen zu erhalten.
Erstellen Sie eine neue im Verzeichnis.
myapp/forms.py
from django import forms
from myapp.models import Posting
class PostingForm(forms.ModelForm):
class Meta:
model = Posting
fields = ('message',)
widgets = {
'message': forms.Textarea(attrs={'cols': 40, 'rows': 4})
}
Es gibt andere Felder, die in den Formularfeldern verwendet werden können, aber diesmal ist es nur Aufgabe, daher wird es so beschrieben. Sie können die Größe des Textbereichs festlegen, wenn dieser mit Widgets in HTML exportiert wird.
Importieren Sie die Modellklasse mit Import und importieren Sie das Django-Buchungsformular. Da diesmal kein Seitenübergang stattfindet, verwenden wir redirect (). Hier können Sie sehen, warum wir den Namespace festlegen.
myapp/views.py
import sys, codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
from django.http.response import HttpResponse
from django.shortcuts import (render, redirect,)
from django import forms
from myapp.models import Posting
from .forms import PostingForm
def index(request):
form = PostingForm(request.POST or None)
if request.method == 'POST':
if form.is_valid():
form.save()
return redirect('myapp:index')
new_text = Posting.objects.all().order_by('-id')
contexts = {
'form':form,
'new_text':new_text,
}
return render(request, 'index.html', contexts)
Hier
new_text = Posting.objects.all().order_by('-id')
Ich schreibe eine Anweisung, um den Inhalt der Datenbank in umgekehrter Reihenfolge der ID anzuzeigen. Es gibt verschiedene Möglichkeiten, .order_by () zu verwenden, daher frage ich mich, ob ich es je nach Anwendung ändern sollte.
contexts = {
'form':form,
'new_text':new_text,
}
Übergeben Sie hier das Django-Formular. Da wir den Inhalt der Datenbank gleichzeitig anzeigen möchten, werden wir diese beiden als drittes Argument der Renderfunktion verwenden. Ich denke, es ist eine gute Idee, diejenigen zu übergeben, die Sie in der Vorlage im Wörterbuch verwenden möchten.
myapp/admin.py
from django.contrib import admin
from myapp.models import Posting
class PostingAdmin(admin.ModelAdmin):
list_display = ('id','message','created_at')
admin.site.register(Posting,PostingAdmin)
Stellen Sie die Anzeigeelemente so ein, dass sie auf der Django-Verwaltungssite überprüft werden.
list_display = ('id','message','created_at')
Wenn Sie auf diese Weise schreiben, können Sie die ID, die Nachricht sowie das Datum und die Uhrzeit der Veröffentlichung anzeigen.
templates/base.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="../static/css/bootstrap.min.css" rel="stylesheet">
<link href="../static/css/custom.css" rel="stylesheet">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="../static/js/bootstrap.min.js"></script>
<title></title>
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
Es ist ein gemeinsamer Teil, der zur Basis wird. Ich habe Bootstrap im statischen Verzeichnis. Sie können die Linkstruktur für die Vorlage schreiben, aber als Referenz habe ich versucht, sie wie gewohnt zu schreiben.
{% static 'css/custom.css' %}
Eine solche Beschreibung ist möglich.
tenplates/index.html
{% extends "base.html" %}
{% block body %}
<div class="container">
<div class="row">
<div class="col-md-12">
<form action="{% url 'myapp:index' %}" method="post">
<div class="row">
{% for field in form %}
<label class="col-sm-3">{{ field.label_tag }}</label>
<label class="col-sm-7">{{ field }}</label>
{% endfor %}
<input type="submit" class="btn btn-primary" value="Anmeldung">
{% csrf_token %}
</div>
</div>
</form>
{% include "to_do.html" %}
</div>
</div>
</div>
{% endblock %}
Es ist die Haupt-HTML-Datei, in der das Formular angezeigt wird. Fügen Sie eine weitere HTML-Datei hinzu, um die von Ihnen eingegebene Aufgabenliste anzuzeigen.
Da der Namespace in urls.py festgelegt ist,
<form action="{% url 'myapp:index' %}" method="post">
Sie können so schreiben. Es ist bequem!
{% csrf_token %}
Dies ist eine Gegenmaßnahme gegen Fälschungen. Da wir einen kryptografischen Pseudozufallswert in HIDDEN einbetten, können Sie nicht POSTEN, wenn Sie vergessen, diesen zu schreiben. Stellen Sie sicher, dass Sie es installieren, bevor Sie den Schaum schließen. Ist es schwer zu vergessen, wenn Sie es direkt hinter dem
templates/to-do.html
<div class="row">
{% for i in new_text %}
<div class="col-md-4">
<p>{{ i.message }} - {{ i.created_at }}</p>
</div>
{% endfor %}
</div>
Es wird der Inhalt sein, der in index.html enthalten ist. Es geht nur darum, den aus der Datenbank erhaltenen Inhalt mit for zu drehen.
virtualenv) $ python manage.py makemigrations myapp
virtualenv) $ python manage.py migrate
erledigt.
Recommended Posts