2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Djangoを使ってみる

Last updated at Posted at 2018-04-16

djangoを使ってみます

#1. Django入門
-Django Girls Tutorialがわかりやすくて良いのではと思います

  • 上記のtutorialのDjangoのインストールのページでは、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.pyForeighKeyに, on_delete=models.CASCADEを追加します

class Post(models.Model):
    author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
  • また、Deploy!のページは、作成したdjangoをサーバー(このサンプルではHeroku)での実行を意図した内容なので、ローカル端末でのdjango稼働で十分でとくにサーバーでの稼働を(今のところ)必要としないかたはこのページは実施しなくてもかまいません

#2. 画像ファイルを送付できるようにします

  • 上記のdjango girlsのサンプルを下記へ変更し画像ファイルの送付を可能にします
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 %}

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
  2. django tutorial
  3. Django REST Frameworkを使って爆速でAPIを実装する
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?