Djangoを使ってみる

djangoを使ってみます

#1. Django入門
-[Django Girls Tutorial](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/)がわかりやすくて良いのではと思います
- 上記のtutorialの[Djangoのインストール](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/django_installation/)のページでは、`pip install django==1.11`ということでdjangoのバージョン1.11をインストールしていますが、最新のdjangoバージョン2.0のほうがいろいろ便利（たとえば後述のurlsの指定で超難解で有名な正規表現(REGEX)の代わりに`path`が使えるようになっている、など）なので、`pip install django`では特にバージョンを指定せず（指定しないと最新のバージョンがインストールされます）にdjangoをインストールされるのが良いのでは、と思います

#2. Django Girlsサンプルからの変更点
- 一部、django2.0ではエラーになる部分があるので読み替えます

```
TypeError: __init__() missing 1 required positional argument: 'on_delete'
```

になったら、`models.py`の`ForeighKey`に, `on_delete=models.CASCADE`を追加します

```
class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
```

- また、[Deploy!](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/deploy/)のページは、作成したdjangoをサーバー（このサンプルではHeroku）での実行を意図した内容なので、ローカル端末でのdjango稼働で十分でとくにサーバーでの稼働を（今のところ）必要としないかたはこのページは実施しなくてもかまいません


#2. 画像ファイルを送付できるようにします
- 上記のdjango girlsのサンプルを下記へ変更し画像ファイルの送付を可能にします

```html:post_edit.html
{% extends 'blog/base.html' %}

{% block content %}
    <h1>New post</h1>
    <form method="POST" class="post-form" enctype="multipart/form-data">{% csrf_token %}
        {{ form.as_p }}
        <input type="file" name="file" accept="image/jpeg, image/png, image/bmp" onchange="this.form.filename.value = this.files[0].name" required />
        ファイル
        <input type="text" name="filename" class="form-control" placeholder="ファイルを選択してください" readonly>
        <button type="submit" class="save btn btn-default">Save</button>
    </form>
{% endblock %}

```

```python:views.py
import os
# from django.conf import settings
from django.shortcuts import render, get_object_or_404, redirect
from django.utils import timezone
from .models import Post
from .forms import PostForm

UPLOAD_DIR = 'static/uploads/'

def post_list(request):
    posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    return render(request, 'blog/post_list.html', {'posts': posts})

def post_detail(request, pk):
    post = get_object_or_404(Post, pk=pk)
    return render(request, 'blog/post_detail.html', {'post': post})

def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            file = request.FILES['file']
            path = os.path.join(UPLOAD_DIR, file.name)
            destination = open(path, 'wb')
            for chunk in file.chunks():
                destination.write(chunk)
            destination.close()

            post = form.save(commit=False)
            post.author = request.user
            post.save()
            return redirect(post_detail, pk=post.pk)
    else:
        form = PostForm()
    return render(request, 'blog/post_edit.html', {'form': form})

def post_edit(request, pk):
    post = get_object_or_404(Post, pk=pk)
    if request.method == "POST":
        form = PostForm(request.POST, instance=post)
        if form.is_valid():
            post = form.save(commit=False)
            post.author = request.user
            post.save()
            return redirect(post_detail, pk=post.pk)
    else:
        form = PostForm(instance=post)
    return render(request, 'blog/post_edit.html', {'form': form})


```

#参考情報
1. [Django Girls Tutorial](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/)
2. [django tutorial](https://docs.djangoproject.com/ja/1.11/intro/)
3. [Django REST Frameworkを使って爆速でAPIを実装する](https://qiita.com/kimihiro_n/items/86e0a9e619720e57ecd8)