Mon propre client Twitter créé avec Django la dernière fois http://qiita.com/Gen6/items/11fa5265053da95fcf0b,
Maintenant que j'ai fait, je voudrais créer une application simple de liste de tâches à l'aide de SQLite. J'ai essayé de rendre la configuration aussi simple que possible pour laisser de la place à la personnalisation. Y a-t-il place pour des modifications telles que l'envoi d'une réponse de la liste des tâches à moi-même sur Twitter?
Cette fois, je vais le faire en utilisant le formulaire de Django. Si je peux comprendre cela, je pense que la gamme de systèmes simples de gestion des clients, de tableaux d'affichage, d'applications de type SNS, etc. va s'étendre considérablement.
Consultez l'article suivant pour savoir comment démarrer avec Django en premier lieu. http://qiita.com/Gen6/items/1848f8b4d938807d082e
Nous partirons du principe que Python 3 et Django sont déjà installés et virtualenv est également installé. Si vous n'êtes pas encore prêt, préparez-vous en vous référant aux articles précédents.
Faisons les commandes du projet Django et créons myapp en dessous.
virtualenv) $ django-admin startproject orders
virtualenv) $ cd orders
virtualenv) $ python manage.py startapp myapp
Assurez-vous que myapp et les commandes sont créées dans le répertoire des commandes.
Veuillez décrire le contenu de settings.py en vous référant à ce qui suit. Utilisez SQLite3 tel quel pour la base de données.
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),
]
Ce sera pratique plus tard en définissant l'espace de noms. Je pense que c'est une bonne idée de prendre l'habitude d'ajouter un espace de noms.
myapp/ursl.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
]
Cette fois, c'est une simple liste de choses à faire, mais nous allons profiter des formulaires intégrés à Django, nous allons donc définir approximativement le modèle. models.DateTimeField () est utile.
myapp/models.py
from django.db import models
class Posting(models.Model):
message = models.CharField(
max_length = 140,
verbose_name = 'Choses à faire',
)
created_at = models.DateTimeField(
auto_now_add = True,
verbose_name= 'Date et l'heure',
)
Nous recevrons le texte de ce qu'il faut faire et la date et l'heure seront écrites automatiquement. J'ai essayé de recevoir jusqu'à 140 caractères.
Créez-en un nouveau dans le répertoire.
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})
}
Il existe d'autres champs qui peuvent être utilisés dans les champs de formulaire, mais cette fois, il ne s'agit que d'une tâche, donc c'est décrit comme ceci. Vous pouvez définir la taille de la zone de texte lorsqu'elle est exportée au format HTML avec des widgets.
Importez la classe de modèle avec l'importation et importez le formulaire de publication Django. Puisqu'il n'y a pas de transition de page cette fois, nous utiliserons redirect (). Vous pouvez voir pourquoi nous définissons l'espace de noms ici.
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)
ici
new_text = Posting.objects.all().order_by('-id')
J'écris une instruction pour afficher le contenu de la base de données dans l'ordre inverse de l'ID. Il y a plusieurs façons d'utiliser .order_by (), donc je me demande si je devrais le changer en fonction de l'application.
contexts = {
'form':form,
'new_text':new_text,
}
Passez le formulaire Django ici. Puisque nous voulons afficher le contenu de la base de données en même temps, nous utiliserons ces deux comme troisième argument de la fonction de rendu. Je pense que c'est une bonne idée de transmettre ceux que vous souhaitez utiliser dans le modèle dans le dictionnaire.
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)
Définissons les éléments d'affichage à vérifier depuis le site de gestion de Django.
list_display = ('id','message','created_at')
En écrivant de cette manière, vous pourrez afficher l'identifiant, le message et la date et l'heure de publication.
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>
C'est une partie commune qui devient la base. J'ai Bootstrap dans le répertoire statique. Vous pouvez écrire la structure des liens pour le modèle, mais pour référence, j'ai essayé de l'écrire comme d'habitude.
{% static 'css/custom.css' %}
Une telle description est possible.
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="enregistrement">
{% csrf_token %}
</div>
</div>
</form>
{% include "to_do.html" %}
</div>
</div>
</div>
{% endblock %}
C'est le fichier HTML principal qui affiche le formulaire. Incluez un autre fichier HTML pour afficher la liste de tâches que vous avez saisie.
Étant donné que l'espace de noms est défini dans urls.py,
<form action="{% url 'myapp:index' %}" method="post">
Vous pourrez écrire comme ça. C'est pratique!
{% csrf_token %}
Il s'agit d'une contre-mesure de contrefaçon de demande intersite. Puisque nous intégrons une valeur pseudo-aléatoire cryptographique dans HIDDEN, si vous oubliez d'écrire ceci, vous ne pourrez pas POST. Assurez-vous de l'installer avant de fermer la mousse. Est-il difficile d'oublier si vous le placez juste derrière le