Django+Xadminでオンライン教育システムを作成(第8回)

ホーム画面とグローバル404、500設定

  • バンカー画像
  • 公開コース
  • 教学機構

新規viewの作成

## ホーム画面view
class TopPageView(View):
    def get(self, request):
        # バンカー画像を取得
        all_banners = Banner.objects.all().order_by('display_order')[:5]
        # 通常コース
        normal_courses = Course.objects.filter(is_banner=False)[:6]
        # バンカーコース(3件)
        banner_courses = Course.objects.filter(is_banner=True)[:3]
        # コース機構
        course_orgs = CourseOrg.objects.all()[:15]
        return render(request, 'index.html', {
            'all_banners': all_banners,
            'normal_courses': normal_courses,
            'banner_courses': banner_courses,
            'course_orgs': course_orgs,
        })

Courseモデルにフィールドを追加:

is_banner = models.BooleanField(default=False, verbose_name="バンカー表示")

CourseOrgモデルにフィールドを追加:

category = models.CharField(max_length=10, default="国内有名大学", verbose_name="機構カテゴリ")

フロントエンドページ

{% block content %}
    <div class="banner">
        <div class="wp">
            <div class="fl">
                <div class="imgslide">
                     {% for banner\_item in all\_banners %} - [ ![]({{ MEDIA_URL }}{{ banner_item.image }}) ](<{{ banner_item.link_url }}>)
 {% endfor %} 
                </div>
                <div class="unslider-arrow prev"></div>
                <div class="unslider-arrow next"></div>
            </div>
        </div>
    </div>

    <section>
        <div class="wp">
            - ![]({% static 'images/feature1.png' %})専門性と権威
- ![]({% static 'images/feature2.png' %})最新のコース
- ![]({% static 'images/feature3.png' %})ベテラン講師
- ![]({% static 'images/feature4.png' %})正確なデータ
        </div>
    </section>
 
    <section>
        <div class="module">
            <div class="wp">
                <h1>公開コース</h1>
                <div class="module1 eachmod">
                    <div class="module1_1 left">
                        ![]({% static 'images/module1_1.jpg' %})
                        <p class="fisrt_word">ベテラン講師による授课<br/>専門性と権威</p>
                        <a class="more" href="{% url 'course:list' %}">更多コースを見る ></a>
                    </div>
                    <div class="right group_list">
                        <div class="module1_2 box">
                            <div class="imgslide2">
                                 {% for b\_course in banner\_courses %} - [ ![]({{ MEDIA_URL }}{{ b_course.thumbnail }}) ](<{% url 'course:course_detail' b_course.id %}>)
 {% endfor %} 
                            </div>
                            <div class="unslider-arrow2 prev"></div>
                            <div class="unslider-arrow2 next"></div>
                        </div>
                        {% for n_course in normal_courses %}
                            <div class="module1_{{ forloop.counter|add:2 }} box">
                                <a href="{% url 'course:course_detail' n_course.id %}">
                                    ![]({{ MEDIA_URL }}{{ n_course.thumbnail }})
                                </a>
                                <div class="des">
                                    <a href="{% url 'course:course_detail' n_course.id %}">
                                        <h2 title="{{ n_course.title }}">{{ n_course.title }}</h2>
                                    </a>
                                    <span class="fl">難易度:<i class="key">{{ n_course.get_level_display }}</i></span>
                                    <span class="fr">学習者数:{{ n_course.enrolled_count }}</span>
                                </div>
                                <div class="bottom">
                                    <span class="fl"
                                          title="{{ n_course.organization.name }}">{{ n_course.organization.name }}</span>
                                    <span class="star fr">{{ n_course.favorite_count }}</span>
                                </div>
                            </div>
                        {% endfor %}
                    </div>
                </div>
            </div>
        </div>
    </section>
    <section>
        <div class="module greybg">
            <div class="wp">
                <h1>コース機構</h1>
                <div class="module3 eachmod">
                    <div class="module3_1 left">
                        ![]({% static 'images/module3_1.jpg' %})
                        <p class="fisrt_word">名校来袭<br/>権威認定</p>
                        <a class="more" href="{% url 'org:org_list' %}">更多機構を見る ></a>
                    </div>
                    <div class="right">
                         {% for org\_item in course\_orgs %} - [<div class="company"> ![]({{ MEDIA_URL }}{{ org_item.logo }})<div class="score"><div class="circle">{{ org\_item.category }}
    ------------------------
    
     </div> </div> </div><span class="key" title="{{ org_item.name }}">{{ org\_item.name }}</span>
    
     ](<{% url 'org:org_home' org_item.id %}>)
 {% endfor %} 
                    </div>
                </div>
            </div>
        </div>
    </section>
{% endblock %}

{% block custom_js %}
    <script type="text/javascript" src="{% static 'js/index.js' %}"></script>
{% endblock %}

説明1:コース コースにはis_banner=Falseとis_banner=Trueの2種類があり、class属性が異なる is_banner=Trueのclassはclass="module1_2 box" is_banner=Falseのclassはclass="module1_3 box" したがって、以下のように記述する必要がある:

class="module1_{{ forloop.counter|add:2 }}"

説明2:コース機構 コース機構のclassはclass=""とclass="five"がある ここで条件分岐が必要:

class="{% if forloop.counter|divisibleby:5 %}five{% endif %}"

divisiblebyフィルタ:割り切れるかどうか判定

グローバル404と500の設定

グローバル404と500について、 設定しない場合、Djangoは自動的にtemplatesフォルダの404.htmlと500.htmlを 호출する https://docs.djangoproject.com/en/2.1/ref/urls/#handler404 ルートディレクトリのurls.pyファイルMxOnline/urls.py

# グローバル404ページ設定
handler404 = 'users.views.pag_not_found'
# グローバル500ページ設定
handler500 = 'users.views.page_error'
# 404対応handle view
def pag_not_found(request):
    from django.shortcuts import render_to_response
    response = render_to_response("404.html", {})
    # responseのステータスコードを設定
    response.status_code = 404
    return response

Debug = True の場合、404は機能しない

ALLOWED_HOSTS = ['*']

debugがfalseの場合の設定。

mediaにアクセスする場合、serveを使って取得하도록設定していた mediaにアクセス时应去的路径

debugがTrueの場合

自動的にSTATICFILES_DIRSからファイルを取得する

debugをfalseに変更すると、Djangoは静的ファイルを管理しなくなる、

一般的に静的ファイルはサードパーティのHTTPサーバーが代理转发する

nginxやApacheは自動的にこれらの静的ファイルを代理する

方法:独自のurlでstaticに応答する

STATIC_ROOT = os.path.join(BASE_DIR, 'static')
re_path(r'^static/(?P<path>.*)', serve, {"document_root": STATIC_ROOT }),
    # グローバル500handle関数
    def page_error(request):
        from django.shortcuts import render_to_response
        response = render_to_response('500.html', {})
        response.status_code = 500
        return response

タグ: Django Xadmin Python Web開発 オンライン教育

10月4日 06:50 投稿