<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Django | リューブログ</title>
	<atom:link href="https://ryuusan.com/tag/django/feed/" rel="self" type="application/rss+xml" />
	<link>https://ryuusan.com</link>
	<description>就活生だった時の気づきや日常の発信のほか、技術ブログとしても運用しています。</description>
	<lastBuildDate>Mon, 26 Oct 2020 03:00:50 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://ryuusan.com/wp-content/uploads/2020/03/cropped-logo-32x32.png</url>
	<title>Django | リューブログ</title>
	<link>https://ryuusan.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>DjangoでAjaxを使っていいねボタンを作る</title>
		<link>https://ryuusan.com/django-ajax/</link>
					<comments>https://ryuusan.com/django-ajax/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Wed, 14 Oct 2020 04:56:15 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Django]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=353</guid>

					<description><![CDATA[こんにちは。リューさん(@Ryu_programs)です。今回の記事ではjQueryを使ってDjangoでAjaxを行っていきたいと思います。 この記事ではDjangoについては詳細な説明をしていないので、Djangoの [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは。リューさん(<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>)です。今回の記事ではjQueryを使ってDjangoでAjaxを行っていきたいと思います。</p>



<p class="wp-block-paragraph">この記事ではDjangoについては詳細な説明をしていないので、Djangoの実装方法などについては以下の記事を読んでみてください。</p>



<a href="https://ryuusan.com/django3/" title="Djangoで簡単な「文字カウントメモ」を作ってみる" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Djangoで簡単な「文字カウントメモ」を作ってみる</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、「Djangoを勉強したい！」「Pythonで何か作ってみたい」という人に向けて、Djangoを用いた簡単なWebアプリ作成の方法を実際に一緒に作りながら紹介していきます。プログラミング学習の助けになれば幸いです。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.05.16</div></div></div></div></a>



  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">はじめに &#8211; Ajaxとは？</a></li><li><a href="#toc2" tabindex="0">実装</a></li><li><a href="#toc3" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">はじめに &#8211; Ajaxとは？</span></h2>



<p class="wp-block-paragraph">Ajax(<strong>Asynchronous&nbsp;JavaScript&nbsp;and&nbsp;XML</strong>)は、それ自体が技術というわけではなく、一種のアプローチです。このAjaxを利用ことで、表示されているページをすべて更新することなく、一部のみを更新することができ、Webアプリケーションの高速化を行うことができます。</p>



<p class="wp-block-paragraph">よくGoogle MapsがAjaxを利用している例として挙げられます。Google Mapsはドラッグに合わせて、ページをリロードすることなく表示される範囲が滑らかに移動しますが、それはAjaxを利用しているためです。</p>



<p class="wp-block-paragraph">また、<strong>Asynchronous&nbsp;JavaScript&nbsp;and&nbsp;XML</strong>にはXMLの文字が入っていますが、JSONの方が軽く、JavaScriptで扱いやすいなどの理由から最近はXMLよりもJavaScriptの方がよく使われているそうです。今回もJSONを使って実装していきたいと思います。</p>



<h2 class="wp-block-heading"><span id="toc2">実装</span></h2>



<p class="wp-block-paragraph">テンプレートファイルは以下の通りです。今回はjQueryの$.ajaxメソッドを利用しているので、base.htmlでjQueryを読み込んでいます。</p>



<p class="wp-block-paragraph">getCookieから$.ajaxSetupまでは、csrftokenをいい感じにするために記述しています。送信フォームを使う場合は<strong>{% csrf_token %}</strong>をつけておけばDjangoが良い感じにしてくれるのですが、ajaxでPOSTする場合はこのように<strong>cookieから拾ってきたcsrftokenの内容を<span class="marker-under">X-CSRFToken</span>という名前でヘッダに設定する</strong>必要があります。</p>



<pre class="wp-block-code"><code>{% extends 'article/base.html' %}

{% block title %}
    My test page
{% endblock %}

{% block content %}
    &lt;ul>
        {% for article in article_list %}
            &lt;li>
                {{ article.article_text }}
                &lt;span class="add_good" id={{ article.id }}>&amp;hearts;&lt;/span>
                &lt;span id="good-count-{{article.id}}">{{ article.good_count }}&lt;/span>
            &lt;/li>
        {% endfor %}
    &lt;/ul>
    &lt;button onclick="location.href='{% url 'article:article_create' %}'">
        追加
    &lt;/button>
{% endblock %}

{% block extrajs %}
    &lt;script>
        function getCookie(name) {
            var cookieValue = null;
            if (document.cookie &amp;&amp; document.cookie !== '') {
                var cookies = document.cookie.split(';');
                for (var i = 0; i &lt; cookies.length; i++) {
                    var cookie = jQuery.trim(cookies&#91;i]);
                    // Does this cookie string begin with the name we want?
                    if (cookie.substring(0, name.length + 1) === (name + '=')) {
                        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                        break;
                    }
                }
            }
            return cookieValue;
        }

        var csrftoken = getCookie('csrftoken');

        function csrfSafeMethod(method) {
            // these HTTP methods do not require CSRF protection
            return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
        }

        $.ajaxSetup({
            beforeSend: function (xhr, settings) {
                if (!csrfSafeMethod(settings.type) &amp;&amp; !this.crossDomain) {
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
            }
        });

        $('.add_good').on('click', function(e) {
            article_id = $(this).attr("id");
            $.ajax({
                'url': '{% url "article:change_count" %}',
                'type': 'POST',
                'data': {
                    'id': article_id,
                },
                'dataType': 'json'
            }).done( response => {
                const response_id = response.id;
                const good_count = response.good_count;
                const element = '#good-count-' + response_id;
                $(element).text(good_count);
            });

        });
    &lt;/script>
{% endblock %}</code></pre>



<p class="wp-block-paragraph">モデルはこんな感じです。good_countがいいねの数に対応しています。ajaxでArticleのidをもらい、viewで対応するArticleのgood_countを増やしてからjsonで追加後のいいね数を返しています。</p>



<pre class="wp-block-code"><code>from django.db import models

# Create your models here.
class Article(models.Model):
    article_text = models.CharField(max_length=100)
    good_count = models.IntegerField(default=0)
    
    def __str__(self):
        return self.article_text</code></pre>



<p class="wp-block-paragraph">viewは以下の通りです。<strong>add_good_count_for_article</strong>が主にajaxの処理を行う関数です。<strong>return JsonResponse</strong>でJsonを返却しています。</p>



<pre class="wp-block-code"><code>from django.shortcuts import render
from .models import Article
from django.views.generic import ListView
from django.views.generic.edit import CreateView
from django.urls import reverse
from django.http import JsonResponse

# Create your views here.
class ArticleListView(ListView):
    template_name = 'article_list.html'
    model = Article
    

class ArticleCreateView(CreateView):
    model = Article
    fields = ('article_text', )
    
    def get_success_url(self):
        return reverse('article:article_list')
        

def add_good_count_for_article(request):
    article_id = request.POST.get('id')
    article = Article.objects.get(id=article_id)
    article.good_count += 1
    article.save()
    data = {
        'id': article_id,
        'good_count': article.good_count,
    }
    return JsonResponse(data)</code></pre>



<p class="wp-block-paragraph">urlは以下のように設定しています。</p>



<pre class="wp-block-code"><code>from django.urls import path
from . import views

app_name = 'article'
urlpatterns = &#91;
    path('', views.ArticleListView.as_view(), name='article_list'),
    path('create/', views.ArticleCreateView.as_view(), name='article_create'),
    path('change/', views.add_good_count_for_article, name='change_count')
]</code></pre>



<p class="wp-block-paragraph">トリミングと拡大をしているのでだいぶ荒いですが、このようにいいねを押すとリロードを挟まずにいいね数が増えていきます。変更はデータベースにも反映されているので、リロードを行ってもいいね数は変更された値のままです。(ListViewを使っているので、順序は変わるかもしれませんが)</p>



<div class="wp-block-image is-style-default"><figure class="aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" src="https://ryuusan.com/wp-content/uploads/2020/10/ajaxDjango.png" alt="" class="wp-image-360" width="388" height="196" srcset="https://ryuusan.com/wp-content/uploads/2020/10/ajaxDjango.png 322w, https://ryuusan.com/wp-content/uploads/2020/10/ajaxDjango-300x152.png 300w, https://ryuusan.com/wp-content/uploads/2020/10/ajaxDjango-320x163.png 320w" sizes="(max-width: 388px) 100vw, 388px" /></figure></div>



<h2 class="wp-block-heading"><span id="toc3">おわりに</span></h2>



<p class="wp-block-paragraph">今回はDjangoとajaxを利用していいね!を行うことができる簡単なWebアプリを実装しました。このアプリではいいねを何度も押すことができましたが、ユーザやIPアドレスなどで判別して一度しか押せないようにしたり、いいね！したらcssなどで色を変えたりすればより実用的になると思います。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/django-ajax/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DjangoのTips</title>
		<link>https://ryuusan.com/django-tips/</link>
					<comments>https://ryuusan.com/django-tips/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Mon, 01 Jun 2020 03:21:23 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=282</guid>

					<description><![CDATA[こんにちは。リューさんです。この記事では、Djangoを用いてWebアプリケーションを作成しているときに詰まったこと、困ったこととその解決方法を書いていきます。 目次 ViewsのTipsFormのTipsModelのT [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">こんにちは。リューさんです。この記事では、Djangoを用いてWebアプリケーションを作成しているときに詰まったこと、困ったこととその解決方法を書いていきます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ViewsのTips</a></li><li><a href="#toc2" tabindex="0">FormのTips</a></li><li><a href="#toc3" tabindex="0">ModelのTips</a></li><li><a href="#toc4" tabindex="0">TemplateのTips</a></li><li><a href="#toc5" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ViewsのTips</span></h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><span class="bold"><span class="fz-22px">form入力後、もとのページにリダイレクトさせたい</span></span></p>
</div>



<p class="wp-block-paragraph">formが一つの場合、元居たページにリダイレクトさせることは簡単です。しかし、複数ページで同じviewを使う場合、元居たページにリダイレクトさせるためには少し工夫が必要になります。</p>



<p class="wp-block-paragraph">まず、templateに以下のように記述します。以下の例では、inputのvalueにURLを指定しています。</p>



<pre class="wp-block-code"><code>&lt;form action="{% url 'foo:bar' %}" method="post">
    {% csrf_token %}
    &lt;input type="hidden" name="next" value="{{ request.path }}"/>
    &lt;!--　適当なフォーム -->
    &lt;button class="btn btn-outline-primary" type="submit">send&lt;/button>
&lt;/form></code></pre>



<p class="wp-block-paragraph">次に、viewでその値を受け取り、受け取ったURLにリダイレクトするようにします。views.pyに以下のように記述します。</p>



<pre class="wp-block-code"><code>from django.http import HttpResponseRedirect
from django.shortcuts import redirect

def foo(request, foo_id):
    # 何らかの処理
    if request.method == "POST":
        next_url = request.POST.get('next', None)
        # 何らかの処理

    if next_url:
        return HttpResponseRedirect(next_url)
    else:
        return redirect('hoge:huga')   #値がうまく取れなかったときの処理</code></pre>



<p class="wp-block-paragraph">これで上手くいくはずです。試してみてください。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="has-medium-font-size wp-block-paragraph"><strong>Post送信後、入力した値をclearしたい</strong></p>
</div>



<p class="wp-block-paragraph">掲示板アプリなど、Post後に同じページに戻るようなページをDjangoで作っているとき、Postした入力値がformに残っているときがありませんか？また、Post後にF5やリロードすると、再び入力値が入っているなんてことはありませんか？</p>



<p class="wp-block-paragraph">そんな時は、以下のようにviewでformをsave後にHttpResponseRedirectで同じページにリダイレクトするようにしましょう。また、このようにする場合はformが正常に処理できているか、などもユーザに通知すると良いかもしれません。</p>



<pre class="wp-block-code"><code>if request.method == "POST":
    form = forms.TestForm(request.POST)
        if form.is_valid():
            test = form.save(commit=False)
            test.user = request.user
            test.save()
            return HttpResponseRedirect(request.path)</code></pre>



<h2 class="wp-block-heading"><span id="toc2">FormのTips</span></h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><span class="fz-22px"><strong>ラジオボタンをつけたい</strong></span></p>
</div>



<p class="wp-block-paragraph">こちらは既に素晴らしい記事が多くあるのですが、自分用に書きます。</p>



<p class="wp-block-paragraph">まず、今回は0,1…のような数字でvalueを管理したいと思っているので、models.pyに以下のように記述します。</p>



<pre class="wp-block-code"><code>from django.db import models

class Hoge(models.Model):     
     hoge = models.IntegerField(default=0)</code></pre>



<p class="wp-block-paragraph">次に、forms.pyに以下のように記述します。</p>



<pre class="wp-block-code"><code>from . import models
from django import forms

hoge_choice = &#91;
    (0, 'hello'),
    (1, 'world'),
    (2, '!!!!!'),
]

class HogeForm(forms.ModelForm):
    hoge = forms.ChoiceField(
        widget=forms.RadioSelect,
        label='hoge',
        choices=hoge_choice,
    )

    class Meta:
        model = models.Hoge
        fields = ('hoge',)
        label = {
            'hoge': 'ほげ',
        }</code></pre>



<p class="wp-block-paragraph">あとはviews.pyにこのHogeFormを渡して、以下のようにtemplateに記述すればラジオボタンが実装できるはずです。以下の例はbootstrap4を用いた例ですので、適宜修正してください。</p>



<pre class="wp-block-code"><code>{{ form.hoge.label_tag }}
&lt;div class="border-top border-bottom">
{% for radio in form.hoge %}
    &lt;div class="custom-control custom-radio pt-1 pb-1">
        {{ radio.tag }}
        &lt;label class="custom-control-label" for="{{ radio.id_for_label }}">
            {{ radio.choice_label }}
        &lt;/label>
    &lt;/div>
{% endfor %}
&lt;/div></code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><strong><span class="fz-22px">フォームのタイプに合わせてデザインを変えたい</span></strong></p>
</div>



<p class="wp-block-paragraph">templateファイルに以下のようにif文で分岐させるように記述することで実現できます。</p>



<pre class="wp-block-code"><code>{% for field in form %}
    {% if field.field.widget.input_type == "checkbox" %}
    	&lt;div class="form-check">
    	    {{ field.label_tag }}
            {{ field }}
            {{ field.errors }}
        &lt;/div>  
    {% else %}
    	&lt;div class="form-group">
    	    {{ field.label_tag }}
            {{ field }}
            {{ field.errors }}
        &lt;/div>
    {% endif %}
{% endfor %}</code></pre>



<p class="wp-block-paragraph">ただ、Bootstrapを使う場合、Djangoはulタグで囲まれたformを返してくるのでいい感じにすることができません。そのような場合はカスタムウイジェットを作ることで対応できます。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><strong><span class="fz-22px">フォームのウィジェットを変更したい</span></strong></p>
</div>



<p class="wp-block-paragraph">forms.py に以下のように記述します。以下の例は__init__で変更していますが、Metaやviewで変更する方法もあります。</p>



<pre class="wp-block-code"><code>class Meta:
    model = models.Hoge
    fields = ('hoge', 'huga')

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields&#91;'hoge'].widget = forms.CheckboxSelectMultiple()
    self.fields&#91;'hoge'].queryset = self.fields&#91;'hoge'].queryset.filter(hoge__gte=2)</code></pre>



<h2 class="wp-block-heading"><span id="toc3">ModelのTips</span></h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><span class="fz-22px"><strong>カスタムユーザモデルを作成する</strong></span></p>
</div>



<p class="wp-block-paragraph">Djangoの場合ベースのユーザモデルのままだと、開発している途中で「ユーザモデルに年齢や役職を持たせたい！」と思っても、データベースを初期化したり、マイグレーションをごにょごにょしたりしなければ変更できなかったりします。</p>



<p class="wp-block-paragraph">そこで、カスタムユーザモデルの出番です。今回はより簡単な<strong>AbstractUser</strong>を継承して作成しましょう。models.pyに以下のように記述します。</p>



<pre class="wp-block-code"><code>class CustomUser(AbstractUser):
    UserAuth = &#91;
        (0, 'student'),
        (1, 'TA'),
        (2, 'teacher'),
    ]
    user_auth = models.IntegerField(verbose_name='権限', default=0, choices=UserAuth)</code></pre>



<p class="wp-block-paragraph">今回は上のようにカスタムユーザモデルに権限のフィールドを追加しました。このように一度カスタムユーザモデルを追加しておけば、以降はそのモデルに追記していけばいいので、必ず作成しておきましょう。</p>



<p class="wp-block-paragraph">また、追記していくタイプの<strong>AbstractUser</strong>だけではなく、最初から設定されている属性の削除や変更等も行うことができる<strong>AbstractBaseUser</strong>を継承してカスタムユーザモデルを作成することも出来ます。ご自身が作成したいアプリに合わせて利用しましょう。</p>



<h2 class="wp-block-heading"><span id="toc4">TemplateのTips</span></h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><span class="fz-22px"><strong>submitボタンが押せないとき</strong></span></p>
</div>



<p class="wp-block-paragraph">ブラウザで検証してみましょう。</p>



<p class="wp-block-paragraph"><span class="bold"><span class="fz-18px">An invalid form control with name=&#8217;hoge&#8217; is not focusable.</span></span></p>



<p class="wp-block-paragraph">というエラーが出ていませんか？この場合、おそらくformの部品に　<strong><span class="fz-16px">display:none;</span></strong>　というcssが指定されていると思います。display:none;の代わりに、以下のコードを追加しましょう。</p>



<pre class="wp-block-code javascript"><code>var icon_css = {
            visibility:'hidden',
            width:'0',
            height:'0',
        }
$('div.form-group input&#91;name="hoge"]').css(icon_css);</code></pre>



<p class="wp-block-paragraph">この場合は、jqueryを用いてcssを追加していますが、方法は何でも良いです。</p>



<h2 class="wp-block-heading"><span id="toc5">おわりに</span></h2>



<p class="wp-block-paragraph">この記事は公開した後もTipsを学び次第更新していきます。もし、間違えている箇所等ありましたらTwitter(<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>)までお願いします。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/django-tips/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Djangoで簡単な「文字カウントメモ」を作ってみる</title>
		<link>https://ryuusan.com/django3/</link>
					<comments>https://ryuusan.com/django3/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Sat, 16 May 2020 05:52:48 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=254</guid>

					<description><![CDATA[こんにちは。リューさん(@Ryu_programs)です。この記事では以下のような人に向けてDjangoで簡単なWebアプリを作成していきます。 Djangoの学習をしたいけど、何から始めれば良いのか分からない Pyth [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">こんにちは。リューさん(<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>)です。この記事では以下のような人に向けてDjangoで簡単なWebアプリを作成していきます。</p>


<div class="blank-box bb-tab bb-point bb-blue">
<ul>
<li>Djangoの学習をしたいけど、何から始めれば良いのか分からない</li>
<li>Pythonを使って何か作ってみたい</li>
<li>プログラミングについて興味がある</li>
</ul>
</div>


<p class="wp-block-paragraph">また、この記事は以前の記事の続きです。まだ読んでいない場合は、是非読んでみてください。</p>



<a href="https://ryuusan.com/django1/" title="Django学習 ~Django紹介編~" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Django学習 ~Django紹介編~</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、DjangoやWebフレームワークについて分かりやすく紹介しています。DjangoとはPythonのWebフレームワークで、利用することで簡単にWebアプリを作成できます。また、この記事の後に環境構築編や開発編などが続きます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.04.06</div></div></div></div></a>


<p class="wp-block-paragraph">Dockerを用いて環境構築する場合はこの記事がお勧めです。</p>



<a href="https://ryuusan.com/django2/" title="Django学習　～環境構築編～" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Django学習　～環境構築編～</div><div class="blogcard-snippet internal-blogcard-snippet">この記事は紹介編の続きの記事であり、DockerでPythonのWebフレームワークであるDjangoの開発環境構築を分かりやすく説明しています。Djangoを学んでみたい方、Pythonで何か作ってみたいと思っている方は読んでみてください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.04.07</div></div></div></div></a>



  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">アプリケーションを作成する</a></li><li><a href="#toc2" tabindex="0">settings.pyを変更する</a></li><li><a href="#toc3" tabindex="0">モデルを変更する</a></li><li><a href="#toc4" tabindex="0">views.pyを確認用に変更する</a></li><li><a href="#toc5" tabindex="0">URL関連の設定を行う</a></li><li><a href="#toc6" tabindex="0">アプリにアクセスする</a></li><li><a href="#toc7" tabindex="0">base.htmlを作成する</a></li><li><a href="#toc8" tabindex="0">一覧表示テンプレートを作成する</a></li><li><a href="#toc9" tabindex="0">データを追加できるようにする</a></li><li><a href="#toc10" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">アプリケーションを作成する</span></h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><span class="bold"><span class="fz-22px">countmemoアプリケーションを作成する</span></span></p>
</div>



<p class="wp-block-paragraph">まず、manage.pyと同じディレクトリ上で以下のコマンドを実行し、<span class="bold">countmemo</span>アプリケーションを作成しましょう。</p>



<pre class="wp-block-code"><code>$ python3 manage.py startapp countmemo</code></pre>



<p class="wp-block-paragraph">このコードはDockerを利用している場合、以下のようなコードになります。</p>



<pre class="wp-block-code"><code>$ docker-compose run web ./manage.py startapp countmemo</code></pre>



<p class="wp-block-paragraph">上のコードを実行すると、<span class="bold">countmemo</span>ディレクトリが作成され、その中に<span class="bold">models.py</span>や<span class="bold">views.py</span>が入っているはずです。以下は<a href="https://paiza.cloud/ja/">PaizaCloud</a>のスクリーンショットなので、表示形式は少し違うかもしれませんが、このようなファイル構成になっていれば問題ありません。<span class="bold">example</span>はプロジェクト名です。</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="211" height="332" src="https://ryuusan.com/wp-content/uploads/2020/05/file.jpg" alt="" class="wp-image-257" srcset="https://ryuusan.com/wp-content/uploads/2020/05/file.jpg 211w, https://ryuusan.com/wp-content/uploads/2020/05/file-191x300.jpg 191w" sizes="(max-width: 211px) 100vw, 211px" /></figure></div>



<h2 class="wp-block-heading"><span id="toc2">settings.pyを変更する</span></h2>



<p class="wp-block-paragraph">その後、<span class="bold">settings.py</span>に新しいアプリを作成したことを教えてあげましょう。<span class="marker">settings.py内のINSTALLED_APPS</span>に以下のように&#8217;countmemo.apps.CountmemoConfig&#8217;を記述します。</p>



<pre class="wp-block-code python"><code>INSTALLED_APPS = &#91;
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'countmemo.apps.CountmemoConfig',
]</code></pre>



<h2 class="wp-block-heading"><span id="toc3">モデルを変更する</span></h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><span class="bold"><span class="fz-22px">models.pyを変更する</span></span></p>
</div>



<p class="wp-block-paragraph">次に、<span class="marker">countmemoフォルダ内のmodels.py</span>を書き換えていきます。このmodels.pyを元にDjangoがデータベースを操作してくれるので、非常に大事なファイルです。今回は以下のように記述していきます。</p>



<pre class="wp-block-code python"><code>from django.db import models
from django.utils import timezone

# Create your models here.
class MemoModel(models.Model):
    memo_text = models.CharField(max_length=200)
    up_date = models.DateTimeField(default=timezone.now)
    length = models.IntegerField(default=0)

    def __str__(self):
        return self.memo_text</code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><span class="bold"><span class="fz-22px">マイグレーションを行う</span></span></p>
</div>



<p class="wp-block-paragraph">models.pyに追記したらマイグレーションを実行しましょう。こうすることでDBに変更を加えます。<span class="bold">models.py</span>を変更した場合は必ず行っておけば間違いありません。</p>



<p class="wp-block-paragraph">manage.pyと同階層で以下のコマンドを実行します。</p>



<pre class="wp-block-code"><code>$ python3 manage.py make migrations
$ python3 manage.py migrate</code></pre>



<p class="wp-block-paragraph">Dockerの場合は、以下のようなコマンドになります。</p>



<pre class="wp-block-code"><code>$ docker-compose run web ./manage.py make migrations
$ docker-compose run web ./manage.py migrate</code></pre>



<h2 class="wp-block-heading"><span id="toc4">views.pyを確認用に変更する</span></h2>



<p class="wp-block-paragraph">countmemoフォルダ内の<span class="bold">views.py</span>を以下のように変更しましょう。</p>



<pre class="wp-block-code python"><code>from django.shortcuts import render
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world!!!!!")</code></pre>



<p class="wp-block-paragraph"><span class="marker-under">views.pyは簡単に言えば<span class="bold">アプリの処理に関する役割</span>を担います。</span>今回は確認のために、<span class="bold">Hello, world!!!!!と表示する</span>ように記述しています。</p>



<h2 class="wp-block-heading"><span id="toc5">URL関連の設定を行う</span></h2>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><span class="bold"><span class="fz-22px">countmemoアプリ内にurls.pyを作成する</span></span></p>
</div>



<p class="wp-block-paragraph"><span class="bold">views.py</span>を変更したら、次は<span class="bold">urls.py</span>を変更してアクセスできるようにしましょう。まず、<span class="bold">countmemo</span>フォルダ内に<span class="bold">urls.py</span>というファイルを作成し、以下のように記述します。</p>



<p class="wp-block-paragraph">また、<span class="bold">app_name</span>を記述することで、アプリが大量になったときにviews.pyやテンプレートファイルからアクセスしやすくなります。記述しておきましょう。</p>



<pre class="wp-block-code python"><code>from django.urls import path

from . import views

app_name = 'countmemo'
urlpatterns = &#91;
    path('', views.index, name='index'),
]</code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><span class="bold"><span class="fz-22px">プロジェクト内のurls.pyを変更する</span></span></p>
</div>



<p class="wp-block-paragraph">僕の場合は、<span class="bold">example</span>というプロジェクト名なので、<span class="marker">exampleフォルダの中のurls.py</span>を変更していきます。こうすることで、countmemoアプリ内のurls.pyを読み込むようになります。</p>



<pre class="wp-block-code python"><code>from django.contrib import admin
from django.urls import path,include

urlpatterns = &#91;
    path('admin/', admin.site.urls),
    path('', include('countmemo.urls')),
]</code></pre>



<h2 class="wp-block-heading"><span id="toc6">アプリにアクセスする</span></h2>



<p class="wp-block-paragraph">runserverコマンドを実行しましょう。</p>



<p class="wp-block-paragraph">Dockerの場合は以下の、以前の記事で説明したURLに、それ以外の環境を使っている場合は環境構築時にDjangoのロケットが表示されていたURLにアクセスしてみてください。</p>



<a href="https://ryuusan.com/django2/" title="Django学習　～環境構築編～" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Django学習　～環境構築編～</div><div class="blogcard-snippet internal-blogcard-snippet">この記事は紹介編の続きの記事であり、DockerでPythonのWebフレームワークであるDjangoの開発環境構築を分かりやすく説明しています。Djangoを学んでみたい方、Pythonで何か作ってみたいと思っている方は読んでみてください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.04.07</div></div></div></div></a>


<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" src="https://ryuusan.com/wp-content/uploads/2020/05/hello-world-1024x586.jpg" alt="" class="wp-image-261" width="569" height="325" srcset="https://ryuusan.com/wp-content/uploads/2020/05/hello-world-1024x586.jpg 1024w, https://ryuusan.com/wp-content/uploads/2020/05/hello-world-300x172.jpg 300w, https://ryuusan.com/wp-content/uploads/2020/05/hello-world-768x439.jpg 768w, https://ryuusan.com/wp-content/uploads/2020/05/hello-world-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/05/hello-world-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/05/hello-world.jpg 1135w" sizes="(max-width: 569px) 100vw, 569px" /></figure></div>



<p class="wp-block-paragraph">トリミングしているため分かりづらいですが、上記のようにHello, world!!!!!と表示されていれば成功です。次のステップへと進みましょう。</p>



<h2 class="wp-block-heading"><span id="toc7">base.htmlを作成する</span></h2>



<p class="wp-block-paragraph">次に、base.htmlを作成します。まず、countmemoフォルダの中にtemplatesフォルダを作成し、さらにそのtemplatesフォルダの中にcountmemoフォルダを作成しましょう。</p>



<p class="wp-block-paragraph">そして、countmemoフォルダの中にbase.htmlを作成します。</p>



<p class="wp-block-paragraph">現在、<span class="bold">countmemo &gt; templates &gt; countmemo &gt; base.html</span>のようになっているはずです。そうであればbase.htmlに以下のように追記していきます。今回はbootstrap4を使うので、そちらもbase.htmlで読み込んでいきます。</p>



<pre class="wp-block-code"><code>&lt;!doctype html>
&lt;html lang="ja">
    &lt;head>
        &lt;title>{% block title %}{% endblock %}&lt;/title>
        &lt;!-- Required meta tags -->
        &lt;meta charset="utf-8">
        &lt;meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

        &lt;!-- Bootstrap CSS -->
        &lt;link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/css/bootstrap.min.css" integrity="sha384-/Y6pD6FV/Vv2HJnA6t+vslU6fwYXjCFtcEpHbNJ0lyAFsXTsjBbfaDjzALeQsN6M" crossorigin="anonymous">
    &lt;/head>
    &lt;body>
        {% block content %}
        {% endblock %}

        &lt;script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous">&lt;/script>
        &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.11.0/umd/popper.min.js" integrity="sha384-b/U6ypiBEHpOf/4+1nzFpr53nxSS+GLCkfwBdFNTxtclqqenISfwAzpKaMNFNmj4" crossorigin="anonymous">&lt;/script>
        &lt;script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta/js/bootstrap.min.js" integrity="sha384-h0AbiXch4ZDo7tp9hKZ4TsHbi047NrKGLO3SEJAg45jXxnGIfYzk4Si90RDIqNm1" crossorigin="anonymous">&lt;/script>
        {% block extrajs %}
        {% endblock %}
    &lt;/body>
&lt;/html></code></pre>



<p class="wp-block-paragraph">base.htmlは他のhtmlファイルのひな型のようなものです。用いることで大幅にコードを減らすことができます。</p>



<h2 class="wp-block-heading"><span id="toc8">一覧表示テンプレートを作成する</span></h2>



<p class="wp-block-paragraph"><span class="marker-under">countmemoフォルダ内のviews.pyを以下のように変更します。</span>generic.ListViewはデータ一覧を表示したい時に使うと便利です。テンプレートファイルには、object_listという名前でデータが渡されます。</p>



<pre class="wp-block-code"><code>from django.shortcuts import render
from django.views import generic

from .models import MemoModel

class MemoListView(generic.ListView):
    model = MemoModel
　　template_name = 'countmemo/memolist.html'</code></pre>



<p class="wp-block-paragraph">views.pyを変更したので、同じく<span class="marker-under">countmemoフォルダ内のurls.pyを以下のように変更します。</span>classベースのviewを使った場合は、以下のようにas_view()をつけるようにしましょう。</p>



<pre class="wp-block-code"><code>from django.urls import path

from . import views

app_name = 'countmemo'
urlpatterns = &#91;
    path('', views.MemoListView.as_view(), name='index'),
]</code></pre>



<p class="wp-block-paragraph">MemoListViewのための<span class="marker-under">memolist.htmlを、templateフォルダ内のcountmemoフォルダ内に作成します。</span>object_listで渡されたデータをfor文を用いて順に取り出し、テーブルの形にまとめています。</p>



<pre class="wp-block-code"><code>{% extends 'countmemo/base.html' %}

{% block title %} memolist {% endblock %}

{% block content %}
    &lt;table class="table">
        &lt;thead>
            &lt;tr>
                &lt;th>#&lt;/th>
                &lt;th>テキスト&lt;/th>
                &lt;th>文字長&lt;/th>
                &lt;th>作成日&lt;/th>
            &lt;/tr>    
        &lt;/thead>
        &lt;tbody>
            {% for data in object_list %}
                &lt;tr>
                    &lt;th>{{ data.id }}&lt;/th>
                    &lt;th>{{ data.memo_text }}&lt;/th>
                    &lt;th>{{ data.length }}&lt;/th>
                    &lt;th>{{ data.up_date }}&lt;/th>
                &lt;/tr>
            {% endfor %}
        &lt;/tbody>
    &lt;/table>
{% endblock %}</code></pre>



<p class="wp-block-paragraph">ここまで完了したら、以下のコマンドでサーバーを動かしましょう。</p>



<pre class="wp-block-code"><code>$ python3 manage.py runserver</code></pre>



<p class="wp-block-paragraph">Dockerの場合は次のようなコマンドになります。ただ、Dockerの場合はdocker-compose up -dで既にrunserverを実行していると思うので、必要ないかもしれません。</p>



<pre class="wp-block-code"><code>$ docker-compose run web ./manage.py runserver</code></pre>



<p class="wp-block-paragraph">先ほどのURLにアクセスし、以下のようになっていれば成功です。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="437" src="https://ryuusan.com/wp-content/uploads/2020/05/table-example-1024x437.jpg" alt="" class="wp-image-267" srcset="https://ryuusan.com/wp-content/uploads/2020/05/table-example-1024x437.jpg 1024w, https://ryuusan.com/wp-content/uploads/2020/05/table-example-300x128.jpg 300w, https://ryuusan.com/wp-content/uploads/2020/05/table-example-768x327.jpg 768w, https://ryuusan.com/wp-content/uploads/2020/05/table-example-1536x655.jpg 1536w, https://ryuusan.com/wp-content/uploads/2020/05/table-example.jpg 1658w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading"><span id="toc9">データを追加できるようにする</span></h2>



<p class="wp-block-paragraph">まず、<span class="marker-under">views.pyに次のように記述します</span>。</p>



<pre class="wp-block-code python"><code>from django.shortcuts import render, redirect
from django.views import generic

from .models import MemoModel

class MemoListView(generic.ListView):
    model = MemoModel
    template_name = 'countmemo/memolist.html'
    

class CreateMemo(generic.CreateView):
    model = MemoModel
    fields = &#91;'memo_text',]
    template_name = 'countmemo/memoadd.html'
    
    def form_valid(self, form):
        memo = form.save(commit=False)
        memo.length = len(memo.memo_text)
        memo.save()
        return redirect('countmemo:index')</code></pre>



<p class="wp-block-paragraph">変更点はCreateMemo以下です。この場合、models.pyで指定したmemo_textのみを入力し、lengthに入力された値の文字列長を格納するようにしています。</p>



<p class="wp-block-paragraph">form_validは入力された文字列が要件を満たすときに呼び出されます。</p>



<p class="wp-block-paragraph">次に、<span class="marker-under">アプリの方のurls.pyを以下のように変更します。</span></p>



<pre class="wp-block-code python"><code>from django.urls import path

from . import views

app_name = 'countmemo'
urlpatterns = &#91;
    path('', views.MemoListView.as_view(), name='index'),
    path('add/', views.CreateMemo.as_view(), name='add'),
]</code></pre>



<p class="wp-block-paragraph">こちらも、変更点はview.CreateMemo.as_view()の部分だけです。</p>



<p class="wp-block-paragraph"><span class="marker-under">以前作成したmemolist.htmlにデータ追加ページに遷移するためのボタンを設置します。</span>追記する場所はどこでもいいです。僕はテーブルの下のところに設置しました。</p>



<pre class="wp-block-code"><code>&lt;a class="btn btn-primary d-block d-md-inline-block mb-2 mb-md-0" 
href="{% url 'countmemo:add' %}" role="button">追加&lt;/a></code></pre>



<p class="wp-block-paragraph"><span class="marker-under">その後、memoadd.htmlをmemolist.htmlやbase.htmlと同じフォルダに作成し、以下のように記述します。</span></p>



<pre class="wp-block-code"><code>{% extends 'countmemo/base.html' %}

{% block title %} memoadd {% endblock %}

{% block content %}
    &lt;form method="post">
    {% csrf_token %}

    {{ form }}
    &lt;button class="btn btn-primary" type="submit">save&lt;/button>
    &lt;/form>
{% endblock %}</code></pre>



<p class="wp-block-paragraph">bootstrapを適用させるにはformの内容をひとつづつ記述し、classを追加するか、javascriptやforms.py等で自動的に追加するかなどの作業が必要なのですが、今回は省きます。また、それらの記事も書くかもしれません。</p>



<p class="wp-block-paragraph">ここまで終わったら、runserverコマンドを実行してWebアプリを動かしてみましょう。先ほどの画面に追加ボタンが現れているはずです。そのボタンをクリックしてください。以下の写真のようになっていれば成功です。</p>



<figure class="wp-block-image size-large is-style-default"><img loading="lazy" decoding="async" width="1024" height="515" src="https://ryuusan.com/wp-content/uploads/2020/05/memo-add-1024x515.jpg" alt="" class="wp-image-271" srcset="https://ryuusan.com/wp-content/uploads/2020/05/memo-add-1024x515.jpg 1024w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add-300x151.jpg 300w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add-768x386.jpg 768w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add-1536x773.jpg 1536w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add.jpg 1578w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">上手く動いていたら適当に入力してみてください。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="486" src="https://ryuusan.com/wp-content/uploads/2020/05/memo-add-success-1-1024x486.jpg" alt="" class="wp-image-273" srcset="https://ryuusan.com/wp-content/uploads/2020/05/memo-add-success-1-1024x486.jpg 1024w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add-success-1-300x142.jpg 300w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add-success-1-768x365.jpg 768w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add-success-1-1536x729.jpg 1536w, https://ryuusan.com/wp-content/uploads/2020/05/memo-add-success-1.jpg 1599w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">このように、うまくカウントできていれば成功です。</p>



<h2 class="wp-block-heading"><span id="toc10">まとめ</span></h2>



<p class="wp-block-paragraph">どうでしたか？Djangoを使えば、慣れてしまえば簡単なアプリをこのように30分程度で作れてしまいます。もちろん、今回のアプリはデザインも機能も優れているとは言い難いですが、Djangoのすごさを少しでも分かってもらえたのではないでしょうか。</p>



<p class="wp-block-paragraph">もし、「ここが分からない」「分かりづらい」などありましたら、Twitter(<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>)までよろしくお願いします。</p>



<p class="wp-block-paragraph">また、今回利用したPythonの学習方法などもブログに書いています。よろしければ読んでみてください。</p>



<a href="https://ryuusan.com/python-study/" title="Pythonの勉強方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/python-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/python-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Pythonの勉強方法</div><div class="blogcard-snippet internal-blogcard-snippet">最近人気沸騰中のプログラミング言語、Pythonの紹介から、Pythonの勉強方法まで詳細に説明していきます。初学者向けの記事ですが、初学者はもちろん、プログラミング経験者でPythonをまだ勉強していない方に対してもおすすめできる内容です。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.03.10</div></div></div></div></a>


<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/django3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Django学習　～環境構築編～</title>
		<link>https://ryuusan.com/django2/</link>
					<comments>https://ryuusan.com/django2/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Tue, 07 Apr 2020 08:55:07 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=237</guid>

					<description><![CDATA[こんにちは。はじめまして。リューさん(@ryu_programs)です。この記事では以下のような人に向けて、Dockerを利用したDjangoの開発環境構築について説明していきます。 Djangoの学習をしたいけど、どう [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">こんにちは。はじめまして。リューさん(<a href="https://twitter.com/ryu_programs">@ryu_programs</a>)です。この記事では以下のような人に向けて、Dockerを利用したDjangoの開発環境構築について説明していきます。</p>


<div class="blank-box bb-tab bb-point bb-blue">
<ol>
<li>Djangoの学習をしたいけど、どうすればいいのか分からない</li>
<li>Djangoの環境構築につまづいている</li>
<li>紹介編を見て、Djangoを学習しようと思った</li>
</ol>
</div>


<p class="wp-block-paragraph">また、Djangoの紹介記事やPythonの勉強方法も書いています。もしまだ読んでいない方がいれば、読んでみてください。</p>



<a href="https://ryuusan.com/django1/" title="Django学習 ~Django紹介編~" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Django学習 ~Django紹介編~</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、DjangoやWebフレームワークについて分かりやすく紹介しています。DjangoとはPythonのWebフレームワークで、利用することで簡単にWebアプリを作成できます。また、この記事の後に環境構築編や開発編などが続きます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.04.06</div></div></div></div></a>

<a href="https://ryuusan.com/python-study/" title="Pythonの勉強方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/python-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/python-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Pythonの勉強方法</div><div class="blogcard-snippet internal-blogcard-snippet">最近人気沸騰中のプログラミング言語、Pythonの紹介から、Pythonの勉強方法まで詳細に説明していきます。初学者向けの記事ですが、初学者はもちろん、プログラミング経験者でPythonをまだ勉強していない方に対してもおすすめできる内容です。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.03.10</div></div></div></div></a>


<p class="wp-block-paragraph">また、続編であるWebアプリ作成編も公開しました。良ければ読んでみてください。リンクは最後の方にも載せておきます。</p>



<a href="https://ryuusan.com/django3/" title="Djangoで簡単な「文字カウントメモ」を作ってみる" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Djangoで簡単な「文字カウントメモ」を作ってみる</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、「Djangoを勉強したい！」「Pythonで何か作ってみたい」という人に向けて、Djangoを用いた簡単なWebアプリ作成の方法を実際に一緒に作りながら紹介していきます。プログラミング学習の助けになれば幸いです。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.05.16</div></div></div></div></a>



  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">なぜDockerを選んだか</a></li><li><a href="#toc2" tabindex="0">最初にすべきこと</a></li><li><a href="#toc3" tabindex="0">Djangoの環境構築</a></li><li><a href="#toc4" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">なぜDockerを選んだか</span></h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="400" height="331" src="https://ryuusan.com/wp-content/uploads/2020/04/docker.jpg" alt="" class="wp-image-238" srcset="https://ryuusan.com/wp-content/uploads/2020/04/docker.jpg 400w, https://ryuusan.com/wp-content/uploads/2020/04/docker-300x248.jpg 300w" sizes="(max-width: 400px) 100vw, 400px" /></figure></div>



<p class="wp-block-paragraph">まず、Pythonという言語はモジュールをimportすることによって、機械学習やWebクローリング、Django開発など様々なことを行うことができます。また、所謂本家PythonであるPython3だけではなく、科学計算に強いAnacondaや、もしかするとやむにやまれぬ事情があってPython2をいまだに使われている人もいるかもしれません。</p>



<p class="wp-block-paragraph">こう聞くとPythonを使ってそのまま開発していたら、ライブラリの数や環境がめちゃくちゃなことになると思いませんか？そこで登場するのが仮想マシンやDockerです。仮想マシンとDockerも仕組みが違うのですが、今回は単に僕の好きなツールであり、軽量かつ高速であるDockerを採用しました。</p>



<h2 class="wp-block-heading"><span id="toc2">最初にすべきこと</span></h2>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="640" height="427" src="https://ryuusan.com/wp-content/uploads/2020/04/pc-1.jpg" alt="" class="wp-image-240" srcset="https://ryuusan.com/wp-content/uploads/2020/04/pc-1.jpg 640w, https://ryuusan.com/wp-content/uploads/2020/04/pc-1-300x200.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></figure></div>



<p class="wp-block-paragraph">まず、こちらの公式ドキュメント(<a href="https://docs.docker.com/toolbox/toolbox_install_windows/">https://docs.docker.com/toolbox/toolbox_install_windows/</a>)を参考にしながら、Docker Toolboxをインストールしましょう。ちなみに、僕はWindows10 homeだったのでDocker Toolboxをインストールしたのですが、Macの場合は<a href="https://hub.docker.com/editions/community/docker-ce-desktop-mac">Docker for Mac</a>であったり、Windows10 Proであれば<a href="https://hub.docker.com/editions/community/docker-ce-desktop-windows">Docker for Windows</a>があるので、ご使用のPCによって変えましょう。</p>



<p class="wp-block-paragraph">また、Docker Toolboxの場合はVirtualBoxを一度アンインストールしてからインストールすると良いかもしれません。Docker Toolboxをインストールすると勝手にVirtualBoxまで付いてくるので、既に存在しているとエラーが出る可能性があります。僕がインストールした時にはそこでエラーが出て躓きました。</p>



<p class="wp-block-paragraph">詳しいインストール方法を紹介している記事はすでにたくさんありますし、OSによってもインストール方法が違う可能性があるのでこの記事では省略します。Docker Toolboxのインストールの際、参考になった記事を紹介しておきます。</p>



<a rel="noopener" href="https://qiita.com/KIYS/items/8ac37f6757a6b7f84569" title="Windows環境にDocker Toolboxをインストールする - Qiita" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fqiita.com%2FKIYS%2Fitems%2F8ac37f6757a6b7f84569?w=320&#038;h=180" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Windows環境にDocker Toolboxをインストールする - Qiita</div><div class="blogcard-snippet external-blogcard-snippet">はじめに Docker、非常に便利ですね。Dockerを使用すればローカル環境を汚すことなく、様々なアプリケーションを実行できたりしてしまいます。Dockerに関する記事はネット上に豊富にありますが、いかんせん界隈の技術の進歩も早くすぐに情...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://qiita.com/KIYS/items/8ac37f6757a6b7f84569" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">qiita.com</div></div></div></div></a>


<h2 class="wp-block-heading"><span id="toc3">Djangoの環境構築</span></h2>



<p class="wp-block-paragraph">Dockerのインストールが終わると、次にDjangoの開発環境を整えていきます。この際、もしPycharmやVScodeなどのエディタをインストールしていない場合、しておくことをお勧めします。ちなみに僕はPythonを使うならPycharmが好きです。</p>



<a rel="noopener" href="https://www.jetbrains.com/ja-jp/pycharm/" title=" PyCharm - 唯一の必携 Python IDE " class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://ryuusan.com/wp-content/uploads/cocoon-resources/blog-card-cache/31f0610a3d1cfde6a8b72227bbdd0107.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title"> PyCharm - 唯一の必携 Python IDE </div><div class="blogcard-snippet external-blogcard-snippet">ウェブ、データ、および AI/ML のプロ開発者向けに構築。 AI による IDE エクスペリエンスで強化されています。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.jetbrains.com/ja-jp/pycharm/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">www.jetbrains.com</div></div></div></div></a>


<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><strong><span class="fz-28px">1.</span><span class="fz-28px">作業ディレクトリの作成</span></strong></p>
</div>



<p class="wp-block-paragraph">Djangoプロジェクトが格納されるディレクトリを適当な場所に作成します。ただし、この時は作成するだけでそのディレクトリは空にしておきましょう。そして、Docker Toolboxを起動し、cdコマンドでそのディレクトリに移動します。</p>



<p class="wp-block-paragraph">この後いくつかのファイルを作成しますが、僕はviコマンドを利用して作成しました。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><strong><span class="fz-28px">2.Dockerfileの作成</span></strong></p>
</div>



<p class="wp-block-paragraph">次に、Dockerfileをそのディレクトリの中に作成します。Dockerfileは、そこに記述された内容に基づいてDockerイメージを作成します。Dockerfileについて、より詳しく知りたい方は以下の記事を読んでみてください。</p>



<a rel="noopener" href="https://knowledge.sakura.ad.jp/15253/" title="Docker入門（第四回）～Dockerfileについて～  |  さくらのナレッジ" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://ryuusan.com/wp-content/uploads/cocoon-resources/blog-card-cache/1eceebfd6f1eae9fb4b080a64b8a4b36.jpg" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Docker入門（第四回）～Dockerfileについて～  |  さくらのナレッジ</div><div class="blogcard-snippet external-blogcard-snippet">こんにちは、Acroquest Technologyの横山です。 4/19(木)にKubernetesやDockerを中心としたコンテナ活用の現状をひとまとめにした開発者のためのイベントである「Japan Contain</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://knowledge.sakura.ad.jp/15253/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">knowledge.sakura.ad.jp</div></div></div></div></a>


<p class="wp-block-paragraph">Dockefileには以下のように記述します。</p>



<pre class="wp-block-code"><code>From python:3.7
ENV PYTHONBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt ./
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
ADD . /code</code></pre>



<p class="wp-block-paragraph">例えば、</p>



<pre class="wp-block-code"><code>RUN mkdir /code</code></pre>



<p class="wp-block-paragraph">というコードは、codeディレクトリをmkdirコマンドで作成しています。このようにRUNやADDなどのコマンドと、それに対応する命令を記述しています。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><span class="fz-28px"><strong>3.requirements.txtの</strong></span><span class="fz-28px"><strong>作成</strong></span></p>
</div>



<p class="wp-block-paragraph">次に、requirements.txtを記述していきます。requirements.txtは、pipを使って指定のパッケージを指定のバージョンでインストールできる設定ファイルです。先ほど作成したディレクトリに、Dockerfileと同様にrequirement.txtを作成して以下のように記述します。</p>



<pre class="wp-block-code"><code>Django
psycopg2</code></pre>



<p class="wp-block-paragraph">これは、Djangoとpsycopg2をインストールするという意味です。psycopg2の後に改行しないように気をつけてください。また、これは注意点なのですが、このrequirement.txtやdockerfileを更新した場合には、以下のように実行しなければ反映されません。</p>



<pre class="wp-block-code"><code>$ docker-compose up --build -d</code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><span class="fz-28px"><strong>4.docker-compose.ymlの作成</strong></span></p>
</div>



<p class="wp-block-paragraph">こちらも先ほどと同じく、作成したディレクトリにdocker-compose.ymlというファイルを作成して記述していきます。このファイルを作成することで、管理が非常に楽になります。内容は以下の通りです。8000ポートでアクセスできるようにしています。</p>



<pre class="wp-block-code"><code>
version: '3'

services:
  db:
    image: postgres
    volumes:
      - poll_db_data:/var/lib/postgresql/data:Z
    ports:
      - "5432"
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=mypassword
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

volumes:
  poll_db_data:
    external: true
</code></pre>



<p class="wp-block-paragraph">Dockerはコンテナを削除してしまうと、データベースの内容もすべて消えてしまうので、&#8221;poll_db_data&#8221;というvolumeを作成し、このようにZオプションをつけたり、external: trueを指定したりしています。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><strong><span class="fz-28px">5.プロジェクトの作成</span></strong></p>
</div>



<pre class="wp-block-code"><code>$ docker-compose run web django-admin.py startproject &#91;プロジェクト名] .</code></pre>



<p class="wp-block-paragraph">このようなコマンドを実行することで、manage.pyの他プロジェクトディレクトリが作成されます。プロジェクト名は基本何でも良いです。また、docker-composeコマンドはdocker-compose.ymlが存在するディレクトリの中で実行してください。</p>



<p class="wp-block-paragraph">次に、作成されたプロジェクトディレクトリの中のsettings.pyを開き、DATABASE=・・・のところを以下のように記述します。USERやPASSWORDは適当です。好きなものを使ってください。</p>



<pre class="wp-block-code"><code>DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'mypassword',
        'HOST': 'db',
        'PORT': 5432,
    }
}</code></pre>



<p class="wp-block-paragraph">また、同じくsetting.pyのALLOWED_HOSTの部分を以下のように変更します。</p>



<pre class="wp-block-code"><code>ALLOWED_HOSTS = &#91;"*"]</code></pre>



<p class="wp-block-paragraph">その後、以下のコマンドでDBのマイグレーションを行います。</p>



<pre class="wp-block-code"><code>$ docker-compose run web ./manage.py makemigrations
$ docker-compose run web ./manage.py migrate</code></pre>



<p class="wp-block-paragraph">さらに、スーパーユーザーも作成してしまいます。以下のコマンドを実行すると、ユーザ名やメールアドレス、パスワード等の入力を求められると思うので、入力してください。Djangoの管理ページにアクセスするために必要です。</p>



<pre class="wp-block-code"><code>$ docker-compose run web ./manage.py createsuperuser</code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><strong><span class="fz-28px">6.コンテナの作成・起動</span></strong></p>
</div>



<pre class="wp-block-code"><code>$ docker-compose up -d</code></pre>



<p class="wp-block-paragraph">このコマンドを実行してコンテナを作成・起動しましょう。-dオプションをつけることで、コンテナ起動後もコマンドを実行できます。</p>



<p class="wp-block-paragraph">そして、次のコマンドでdefaultマシンに割り振られたipアドレスを取得します。僕の場合はdefaultマシンをそのまま使っていますが、別のマシンを使っている方はそのマシンについて調べてください。何もしていなければdefaultマシンを使っているはずです。</p>



<pre class="wp-block-code"><code>$ docker-machine ip default</code></pre>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><strong><span class="fz-28px">7.アクセス</span></strong></p>
</div>



<p class="wp-block-paragraph">chrome等で、http://[<strong>6で調べたIPアドレス</strong>]:8000でアクセスしてみてください。(例：http://0.0.0.0:8000)この8000はdocker-compose.ymlで指定した値です。</p>



<p class="wp-block-paragraph">以下のような画面になれば正しく環境構築ができています。正確には、右上のDjangoは3.0などになっているはずです。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="802" height="616" src="https://ryuusan.com/wp-content/uploads/2020/04/Django_2.0_default_page.png" alt="" class="wp-image-248" srcset="https://ryuusan.com/wp-content/uploads/2020/04/Django_2.0_default_page.png 802w, https://ryuusan.com/wp-content/uploads/2020/04/Django_2.0_default_page-300x230.png 300w, https://ryuusan.com/wp-content/uploads/2020/04/Django_2.0_default_page-768x590.png 768w" sizes="(max-width: 802px) 100vw, 802px" /></figure>



<h2 class="wp-block-heading"><span id="toc4">おわりに</span></h2>



<p class="wp-block-paragraph">以上で環境構築編は終わりです。開発編に続きます。Pythonの勉強方法やDjangoの紹介、基本情報技術者試験の勉強方法なども分かりやすく書いているので、良ければ読んでみてください。</p>



<a href="https://ryuusan.com/python-study" title="Pythonの勉強方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/python-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/python-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Pythonの勉強方法</div><div class="blogcard-snippet internal-blogcard-snippet">最近人気沸騰中のプログラミング言語、Pythonの紹介から、Pythonの勉強方法まで詳細に説明していきます。初学者向けの記事ですが、初学者はもちろん、プログラミング経験者でPythonをまだ勉強していない方に対してもおすすめできる内容です。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.03.10</div></div></div></div></a>

<a href="https://ryuusan.com/django1" title="Django学習 ~Django紹介編~" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Django学習 ~Django紹介編~</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、DjangoやWebフレームワークについて分かりやすく紹介しています。DjangoとはPythonのWebフレームワークで、利用することで簡単にWebアプリを作成できます。また、この記事の後に環境構築編や開発編などが続きます。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.04.06</div></div></div></div></a>

<a href="https://ryuusan.com/ipa-study" title="基本情報技術者試験に合格できた勉強方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/goukaku-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/goukaku-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/goukaku-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/goukaku-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">基本情報技術者試験に合格できた勉強方法</div><div class="blogcard-snippet internal-blogcard-snippet">基本情報技術者試験はエンジニアとしての基礎的な知識が問われる試験で、勉強すべき範囲が非常に広く、100時間程度の勉強が必要と言われています。その基本情報技術者試験をこれから受けようと思っている人に向けて、僕が勉強してきたことを紹介します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.03.02</div></div></div></div></a>


<p class="wp-block-paragraph">開発編も公開しました！</p>



<a href="https://ryuusan.com/django3/" title="Djangoで簡単な「文字カウントメモ」を作ってみる" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Djangoで簡単な「文字カウントメモ」を作ってみる</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、「Djangoを勉強したい！」「Pythonで何か作ってみたい」という人に向けて、Djangoを用いた簡単なWebアプリ作成の方法を実際に一緒に作りながら紹介していきます。プログラミング学習の助けになれば幸いです。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.05.16</div></div></div></div></a>


<p class="wp-block-paragraph">また、よろしければ僕のTwitter(<a href="https://twitter.com/ryu_programs">@ryu_programs</a>)のフォロー等もお願いします。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/django2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Django学習 ~Django紹介編~</title>
		<link>https://ryuusan.com/django1/</link>
					<comments>https://ryuusan.com/django1/#respond</comments>
		
		<dc:creator><![CDATA[リューさん]]></dc:creator>
		<pubDate>Mon, 06 Apr 2020 06:10:41 +0000</pubDate>
				<category><![CDATA[プログラミング学習]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://ryuusan.com/?p=214</guid>

					<description><![CDATA[こんにちは、はじめまして。リューさん(@Ryu_programs)です。この記事ではPythonのWebアプリケーションフレームワークであるDjangoについて、以下のような人のために紹介していきます。 Pythonを学 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">こんにちは、はじめまして。リューさん(<a href="https://twitter.com/Ryu_programs">@Ryu_programs</a>)です。この記事ではPythonのWebアプリケーションフレームワークである<strong>Django</strong>について、以下のような人のために紹介していきます。</p>


<div class="blank-box bb-tab bb-check bb-blue">
<ol>
<li>Pythonを学習しているけど、Pythonで何ができるのか分からない</li>
<li>Pythonを使って就活にも役立つ成果物を作ってみたい</li>
<li>プログラミングに興味あるけど、何から始めればいいのか分からない</li>
</ol>
</div>


<p class="wp-block-paragraph">なお、この記事は「環境構築編」や「簡単なアプリケーション作成編」などに続いていく予定です。ぜひこの記事を読み、Djangoについて軽く理解しておいてください。</p>



<a href="https://ryuusan.com/django2/" title="Django学習　～環境構築編～" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Django学習　～環境構築編～</div><div class="blogcard-snippet internal-blogcard-snippet">この記事は紹介編の続きの記事であり、DockerでPythonのWebフレームワークであるDjangoの開発環境構築を分かりやすく説明しています。Djangoを学んでみたい方、Pythonで何か作ってみたいと思っている方は読んでみてください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.04.07</div></div></div></div></a>

<a href="https://ryuusan.com/django3/" title="Djangoで簡単な「文字カウントメモ」を作ってみる" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Djangoで簡単な「文字カウントメモ」を作ってみる</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、「Djangoを勉強したい！」「Pythonで何か作ってみたい」という人に向けて、Djangoを用いた簡単なWebアプリ作成の方法を実際に一緒に作りながら紹介していきます。プログラミング学習の助けになれば幸いです。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.05.16</div></div></div></div></a>


<p class="wp-block-paragraph">また、Pythonの勉強方法については以下の記事で紹介しています。Pythonは基本的なことに関しては覚えやすく、コードも書きやすいので、「プログラミングを学習したい！」と思っている人にはお勧めの言語です。</p>



<a href="https://ryuusan.com/python-study/" title="Pythonの勉強方法" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/python-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/python-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/python-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Pythonの勉強方法</div><div class="blogcard-snippet internal-blogcard-snippet">最近人気沸騰中のプログラミング言語、Pythonの紹介から、Pythonの勉強方法まで詳細に説明していきます。初学者向けの記事ですが、初学者はもちろん、プログラミング経験者でPythonをまだ勉強していない方に対してもおすすめできる内容です。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.03.10</div></div></div></div></a>



  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Webフレームワークとは</a></li><li><a href="#toc2" tabindex="0">Djangoの特徴</a></li><li><a href="#toc3" tabindex="0">おわりに</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Webフレームワークとは</span></h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="386" src="https://ryuusan.com/wp-content/uploads/2020/04/Ruby_On_Rails.png" alt="ruby on rails logo" class="wp-image-227" srcset="https://ryuusan.com/wp-content/uploads/2020/04/Ruby_On_Rails.png 1024w, https://ryuusan.com/wp-content/uploads/2020/04/Ruby_On_Rails-300x113.png 300w, https://ryuusan.com/wp-content/uploads/2020/04/Ruby_On_Rails-768x290.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">先ほども書きましたが、DjangoとはPythonのWebフレームワークです。そもそもWebフレームワークとは、<span class="marker-under">便利な機能が用意されており、利用することでWebアプリケーションを簡単に短期間で作成できるようにする</span>といったものです。</p>



<p class="wp-block-paragraph">WebフレームワークにはDjangoのほか、多くの種類があります。この記事ではその中でも有名でよく使われているWebフレームワークを簡単に紹介します。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><strong><span class="fz-28px">1.Laravel</span></strong></p>
</div>



<p class="wp-block-paragraph">Laravelは<strong>PHP</strong>という言語のフレームワークです。そもそも、PHPという言語自体がWeb開発に多く使われていたこともあり、LaravelやPHPのもう一つのフレームワークであるCakePHPは非常に人気のWebフレームワークです。</p>



<p class="wp-block-paragraph">ちなみに、PHPがWeb開発に多く使われると書きましたが、それはPHPが動的にWebページを生成できる、サーバサイドのスクリプト言語であるからです。PHPはWordPressなどにも使われていますね。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><strong><span class="fz-24px"><span class="fz-28px">2.Ruby on rails</span></span></strong></p>
</div>



<p class="wp-block-paragraph">Ruby on railsは<strong>Ruby</strong>という言語のフレームワークです。僕が大学1年生の夏に初めて学習した言語がRubyでした。プログラミングの基礎知識など全くなかった僕が、1ヵ月で<a href="https://paiza.jp/">Paiza</a>のスキルチェックでBランクを獲得できたのは、ひとえにRubyという言語の書きやすさであったり、分かりやすさのおかげだと思います。Ruby on railsもその特徴を受け継いでいます。</p>



<p class="wp-block-paragraph">また、Rubyという言語は日本人のまつもとゆきひろさんが開発された言語であり、その影響なのか日本語の説明が多いことも特徴です。分からないことでもググったら大体日本語での解決法がヒットする、というのは安心できますよね。</p>



<h2 class="wp-block-heading"><span id="toc2">Djangoの特徴</span></h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="640" height="427" src="https://ryuusan.com/wp-content/uploads/2020/04/pc.jpg" alt="pcを操作(装飾)" class="wp-image-230" srcset="https://ryuusan.com/wp-content/uploads/2020/04/pc.jpg 640w, https://ryuusan.com/wp-content/uploads/2020/04/pc-300x200.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<p class="wp-block-paragraph">Djangoの特徴は以下の3点です。もちろんこれ以外の強みも多くあると思いますが、その中でも特に僕が便利だと感じた点を紹介しています。</p>


<div class="blank-box bb-tab bb-point bb-blue">
<ol>
<li><strong>データベースに強い</strong></li>
<li><strong>同じPythonのWebフレームワークであるFlaskよりも大規模開発に向いている</strong></li>
<li><strong>機械学習と組み合わせられる</strong></li>
</ol>
</div>


<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><strong><span class="fz-28px">1.データベースに強い</span></strong></p>
</div>



<p class="wp-block-paragraph">まず、<span class="marker-under">1つめのデータベースに強い</span>というのは、Djangoは<strong>Oracle</strong>、<strong>SQLite</strong>、<strong>MySQL</strong>、<strong>PostgreSQL</strong>などのデータベースに対応しており、なおかつ簡単にデータベースを操作できるからです。</p>



<p class="wp-block-paragraph">Djangoドキュメントの<a href="https://docs.djangoproject.com/ja/3.0/intro/tutorial01/">チュートリアル</a>のような簡単なWebアプリの場合、<span class="marker-under">ほとんどデータベースの知識は必要ありません。</span>(あった方が良いのはもちろんですが。）つまり、Pythonの知識さえ最低限あれば、簡単なWebアプリが作れてしまうということです。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><strong><span class="fz-28px">2.大規模開発に向いている</span></strong></p>
</div>



<p class="wp-block-paragraph">Djangoはログイン機能やセキュリティ対策など必要な機能が全てそろっており、基本的には<span class="marker-under">Django単体でWebアプリを開発すること</span>ができます。このようなフレームワークをフルスタック・フレームワークと呼び、DjangoのほかRuby on railsなどもこのフルスタック・フレームワークです。</p>



<p class="wp-block-paragraph">一方でFlaskなどはマイクロフレームワークと呼ばれており、必要最低限の機能しか備えていません。そのため、足りない機能は拡張などで補うことになります。ただ、このようなマイクロフレームワークは小規模の開発をする際や初心者には、機能が少ないため分かりやすいというメリットもあります。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><strong><span class="fz-28px">3.機械学習と組み合わせられる</span></strong></p>
</div>



<p class="wp-block-paragraph">DjangoでWebアプリケーションを開発する際にはPythonという言語を使いますが、そのPythonは機械学習に強い言語です。また、Webクローリング等もPythonを使うことで簡単に行うことができます。</p>



<p class="wp-block-paragraph">そのため、<span class="marker-under">機械学習やWebクローリングで得られたデータをDjangoを使って表示するWebアプリケーションを、Pythonという言語だけで実装することができる</span>のはDjangoの強みです。</p>



<div class="wp-block-cocoon-blocks-sticky-box blank-box sticky st-blue block-box">
<p class="wp-block-paragraph"><strong><span class="fz-28px">Djangoを利用しているサービス</span></strong></p>
</div>



<p class="wp-block-paragraph">例えば、<span class="marker-under">InstagramやMozillaなど</span>がDjangoを利用して開発された有名なサービスです。1度は使ったことがある人も多いのではないでしょうか。Pythonを使って、あのような素晴らしいサービスを作成することができます。</p>



<h2 class="wp-block-heading"><span id="toc3">おわりに</span></h2>



<p class="wp-block-paragraph">この記事ではDjangoやWebフレームワークの紹介をしました。参考になれば幸いです。また、もしよろしければTwitter(<a href="https://twitter.com/ryu_programs">@ryu_programs</a>)のフォロー等もお願いします。この記事の次は<span class="marker">Dockerを利用したDjango開発環境構築</span>の記事です。</p>



<p class="wp-block-paragraph">公開しましたので、読んでみてください。</p>



<a href="https://ryuusan.com/django2/" title="Django学習　～環境構築編～" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Django学習　～環境構築編～</div><div class="blogcard-snippet internal-blogcard-snippet">この記事は紹介編の続きの記事であり、DockerでPythonのWebフレームワークであるDjangoの開発環境構築を分かりやすく説明しています。Djangoを学んでみたい方、Pythonで何か作ってみたいと思っている方は読んでみてください。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.04.07</div></div></div></div></a>

<a href="https://ryuusan.com/django3/" title="Djangoで簡単な「文字カウントメモ」を作ってみる" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="90" src="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://ryuusan.com/wp-content/uploads/2020/03/Django-160x90.jpg 160w, https://ryuusan.com/wp-content/uploads/2020/03/Django-120x68.jpg 120w, https://ryuusan.com/wp-content/uploads/2020/03/Django-320x180.jpg 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Djangoで簡単な「文字カウントメモ」を作ってみる</div><div class="blogcard-snippet internal-blogcard-snippet">この記事では、「Djangoを勉強したい！」「Pythonで何か作ってみたい」という人に向けて、Djangoを用いた簡単なWebアプリ作成の方法を実際に一緒に作りながら紹介していきます。プログラミング学習の助けになれば幸いです。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://ryuusan.com" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">ryuusan.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.05.16</div></div></div></div></a>


<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://ryuusan.com/django1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
