Après tout, je ne sais pas à quoi l'utiliser, mais je pense que jouer avec l'API Twitter est la meilleure solution pour améliorer la compréhension des modèles de formulaires de Django. Ou plutôt, ne dites pas combien de fois vous jouez avec l'API Twitter. J'ai des symptômes subjectifs.
Puisque Python 3.6 est supposé, la création d'un environnement virtuel est facile.
$ python3 -m venv pyworks
$ ls pyworks/
$ . pyworks/bin/activate
Continuons en supposant que Django est déjà installé.
(pyworks)$ pip install requests requests_oauthlib
(pyworks)$ cd pyworks
(pyworks)$ django-admin startproject tweetsave
(pyworks)$ cd tweetsave
(pyworks)$ python manage.py startapp myapp
Il est prêt pour le moment, mais veuillez obtenir la clé, etc. de l'API Twitter.
Ajoutez (remplacez) la dernière ligne de settings.py comme suit. En ce qui concerne les médias, il est plus facile d'écrire à ce sujet plus tard, donc vous pouvez l'ignorer cette fois. Je me demande si je devrais écrire uniquement la partie du fichier statique.
settings.py
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
USE_I18N = True
USE_L10N = True
USE_TZ = True
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
Il en va de même pour urls.py, qui est écrit de manière redondante, mais je pense que je vais l'écrire parce que "la gestion des fichiers multimédias" peut être effectuée à l'avenir.
urls.py
from django.conf import settings
from django.conf.urls import url, include
from django.conf.urls.static import static
from django.contrib import admin
urlpatterns = [
url(r'^myapp/', include('myapp.urls',namespace='myapp')),
url(r'^admin/', admin.site.urls),
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
Étant donné que urls.py n'existe pas dans myapp /, créez-en un nouveau.
myapp/url.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^', views.index, name='index'),
]
Cette fois, je viens de sauvegarder mes tweets dans la base de données, donc c'est simple.
myapp/models.py
from django.db import models
class MyTweet(models.Model):
tweet_words = models.CharField(max_length=140)
created_at = models.DateTimeField(auto_now_add=True)
Comme c'est un gros problème, je l'écrirai également pour l'écran de gestion.
myapp/admin.py
from django.contrib import admin
from .models import MyTweet
class MyTweetAdmin(admin.ModelAdmin):
list_display = ('id','tweet_words','created_at')
admin.site.register(MyTweet,MyTweetAdmin)
Ce n'est pas grave si vous n'utilisez pas Django Form, mais écrivons le formulaire. Il générera un formulaire très simple sans aucune description facultative, c'est donc tout.
.myapp/forms.py
from django import forms
from myapp.models import MyTweet
class TweetForm(forms.ModelForm):
class Meta:
model = MyTweet
fields = ('tweet_words',)
widgets = {
'tweet_words': forms.Textarea()
}
Quoi que je dise moi-même, c'est très redondant.
myapp/views.py
from django.http.response import HttpResponse
from django.shortcuts import render, redirect
from django import forms
from myapp.models import MyTweet
from myapp.forms import TweetForm
from requests_oauthlib import OAuth1Session
import requests
import json
C_KEY = '++++++++++++++++++++++++++++++++'
C_SECRET = '++++++++++++++++++++++++++++++++'
A_KEY = '++++++++++++++++++++++++++++++++'
A_SECRET = '++++++++++++++++++++++++++++++++'
Post_API = 'https://api.twitter.com/1.1/statuses/update.json'
tw = OAuth1Session(C_KEY,C_SECRET,A_KEY,A_SECRET)
def index(request):
form = TweetForm(request.POST or None)
msg = request.POST.get('tweet_words')
url = Post_API
params = {'status': msg,'lang': 'ja'}
req = tw.post(url, params = params)
if request.method == 'POST':
if form.is_valid():
if req.status_code == 200:
timeline = json.loads(req.text)
form.save()
return redirect('myapp:index')
else:
contexts = {
'Error_message': 'API restreinte',
}
return render(request, 'myapp/index.html', contexts)
return redirect('myapp:index')
result_text = MyTweet.objects.all().order_by('-id')
contexts = {
'form':form,
'result_text':result_text,
}
return render(request, 'myapp/index.html', contexts)
Vérifiez le répertoire de fichiers statiques avant.
Placez le fichier de modèle dans myapp / templates / myapp /. De même pour CSS et JS, Placez-le comme myapp / static / myapp / css ~ etc.
Si vous avez plusieurs applications dans le même projet, vous ne pouvez pas les trouver en raison de conflits de noms! C'est pour éviter.
myapp/base.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
{% load static %}
<link rel="stylesheet" href="{% static 'myapp/css/style.css' %}" >
<link rel="stylesheet" href="{% static 'myapp/css/bootstrap.min.css' %}">
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
myapp/index.html
{% extends 'myapp/base.html' %}
{% block body %}
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="col-md-4">
<form action="{% url 'myapp:index' %}" method="post">
<div class="row">
{% for field in form %}
<label>{{ field.label_tag }}</label>
<label>{{ field }}</label>
{% endfor %}
<input type="submit" class="btn btn-primary" value="Envoyer">
{% csrf_token %}
</div>
</form>
</div>
<div class="col-md-8">
{% include "myapp/result.html" %}
</div>
</div>
</div>
</div>
{% endblock %}
myapp/result.html
{% block body %}
<ul class="row">
{% for i in result_text %}
<li class="box clearfix">
<dl>
<dt> {{ i.created_at }}</dt>
<dd>{{ i.tweet_words }}</dd>
</dl>
</li>
{% endfor %}
</ul>
{% endblock %}
migrations / migrate
Je ferai le promis.
(pyworks)$ python manage.py makemigrations myapp
(pyworks)$ python manage.py migrate
Si nécessaire
(pyworks)$ python manage.py createsuperuser
runserver et exécutez.
Quelle application stérile est née.
Recommended Posts