好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Django+MySQL Dashboard 缃戦〉绔暟鎹簱鍙鍖?/h1>

1. Overview

Python+MySQL+Django, 鏈変簺鏁版嵁鎵樼鍦?MySQL 鐨勬暟鎹簱锛岀劧鍚庢垜浠笇鏈涜繘琛屽彲瑙嗗寲锛岄€氳繃 web 鐨勬柟寮忓鏁版嵁搴撶殑淇℃伅鍘昏繘琛屽睍绀?妫€绱?缁存姢/..

杩欎釜椤圭洰涓紝鎴戜滑鐨勬暟鎹墭绠″湪 MySQL 鐨勬暟鎹簱涓紝鐒跺悗鍦?Django 涓厤缃暟鎹簱淇℃伅锛岃繛鎺ュ埌鏁版嵁搴擄紝鍦ㄥ墠绔敤 Django-table2 杩涜娓叉煋;

鏈€缁堟垜浠彲浠ュ湪 web 绔湅鍒板涓嬫墍绀烘晥鏋滐紝鍙互杩涜灞曠ず鎵€鏈夌殑鏁版嵁锛岀劧鍚庤繘琛屾绱㈠拰杩囨护锛?/p>

 

 

 

2. 娴佺▼

鎯宠鍦?Django 涓闂?MySQL 鏁版嵁搴撶殑鏁版嵁锛岄鍏堣鍦?Django 鐨?setting.py 閲岄潰瑙勫畾濂芥暟鎹簱鐨? 鈥楴ame鈥?/ 鈥楿SER鈥?/ 鈥楶ASSWORD鈥?/strong>锛?/p>

闇€瑕佸浜庡璞?news 鎴栬€呭埆鐨勫疄浣擄紝鍒涘缓 model, 涓嬪浘涓殑 step4锛?/p>

鍒╃敤 Django-tables2 杩涜娓叉煋锛屽叿浣?Django-tables2 鐨勪娇鐢ㄥ彲浠ュ弬鑰?nbsp;https://django-tables2.readthedocs.io/en/latest/pages/tutorial.html ;

杩囨护/鎼滅储/鎺掑簭 閮藉彲浠ュ湪鍚庣锛屽彉鎴愬 query 鐨勬搷浣滐紝濡?step6 锛?/p>

 

 

 

 

 

 3. 婧愮爜

浠g爜鎵樼鍦?github, 鍦?Ubuntu host:

git clone https://github测试数据/coneypo/Django_MySQL_Table

 

index.html

{% load render_table from django_tables2 %}
{% load querystring from django_tables2 %}
{% load bootstrap3 %}
<!doctype html>
<html>
    <head>
        <a href="board/"><title>Django table example</title></a>
        <link rel="stylesheet" href="/static/css/pos.css"/>
        <link rel="stylesheet" href="/static/css/bootstrap.min.css"/>
        <link rel="stylesheet" href="/static/css/table_1.css"/>
        <style>
           body {background-color: whitesmoke;}
        </style>
    <script type="text/javascript" src="/static/js/jquery-1.11.0.js"></script>
</head>
    <body>
    <div id="Top" style="background:#38c">
        <a href="/table_example" id="acrn_title">&nbsp;Django-MySQL example -- coneypo</a>
    </div>
    <div id="Center">
        <div id="Center_Searcher">
            <form action="/news_search" method="get">
            <table class="center_table">
                <tr><td colspan="5"><h3>Search by Title</h3></td></tr>
                <tr>
                    <td>Keyword:</td>
                    <td align="center">&nbsp;&nbsp;<input name="keywd_input" value="{{ keywd_input }}"></td>
                    <td align="center">&nbsp;&nbsp;<input type="submit" value="search"></td>
                </tr>
            </table>
            </form>
        </div>
        <div id="Center_Filter">
            <form action="/news_filter" method="get">
            <table class="center_table">
                <tr><td colspan="5"><h3>Filter</h3></td></tr>
                <tr>
                    <td>Category:</td>
                    <td>&nbsp;&nbsp;<select name="filter_category">
                        {% for i in category_list %}
                          <option value="{{i}}" {% if i == filter_category %} selected{% endif %}>{{i}}</option>
                        {% endfor %}
                    </select></td>
                    <td><input type="submit" value="Filter"></td>
                </tr>
            </table>
            </form>
        </div>
    </div>
    <div id="Table">
        <h3>&nbsp;Device table</h3>
        <form action="/download_excel" method="get">
            &nbsp;&nbsp;<a href="/download_excel">Download to excel</a>
        </form><br>
            {% render_table table %}
    </div>
    </div>
    </body>
</html>

 

views.py

  1 from django.shortcuts import render
  2 from django.db import models
  3 from django.http import HttpResponse
  4 import django_tables2 as tables
  5 import MySQLdb
  6 import datetime
  7 import pytz
  8 from django_tables2.config import RequestConfig
  9 import itertools
 10 from django.db import connection
 11 from djqscsv import render_to_csv_response
 12 
 13 ##### Modify with your database here #####
 14 db = MySQLdb.connect("localhost", "root", "[email protected]", "ithome_news", charset=鈥?/span>utf8鈥?/span>)
 15 cursor = db.cursor()
 16 
 17 category_list = [鈥?/span>All鈥?/span>, 鈥?/span>iPhone搴旂敤鎺ㄨ崘鈥?/span>, 鈥?/span>iPhone鏂伴椈鈥?/span>, 鈥?/span>Win10蹇鈥?/span>, 鈥?/span>Win10璁惧鈥?/span>, 鈥?/span>涓氱晫鈥?/span>, 鈥?/span>浜哄伐鏅鸿兘鈥?/span>, 鈥?/span>浜虹墿鈥?/span>, 鈥?/span>澶╂枃鑸ぉ鈥?/span>, 鈥?/span>濂囪叮鐢靛瓙鈥?/span>, 鈥?/span>瀹夊崜搴旂敤鎺ㄨ崘鈥?/span>,
 18                  鈥?/span>瀹夊崜鎵嬫満鈥?/span>, 鈥?/span>瀹夊崜鏂伴椈鈥?/span>, 鈥?/span>褰卞儚鍣ㄦ潗鈥?/span>, 鈥?/span>鏂拌兘婧愭苯杞?/span>鈥?/span>, 鈥?/span>鏅鸿兘瀹跺眳鈥?/span>, 鈥?/span>鏅鸿兘瀹剁數鈥?/span>, 鈥?/span>娲诲姩浜掑姩鈥?/span>, 鈥?/span>娓告垙蹇姤鈥?/span>, 鈥?/span>鐢靛晢鈥?/span>, 鈥?/span>鐢靛瓙绔炴妧鈥?/span>, 鈥?/span>鐢佃剳纭欢鈥?/span>, 鈥?/span>绉戞妧鍓嶆部鈥?/span>, 鈥?/span>绉戞櫘甯歌瘑鈥?/span>,
 19                  鈥?/span>绗旇鏈?/span>鈥?/span>, 鈥?/span>缃戠粶鈥?/span>, 鈥?/span>鑻规灉鈥?/span>, 鈥?/span>杞﹁仈缃?/span>鈥?/span>, 鈥?/span>杞欢蹇姤鈥?/span>, 鈥?/span>杈e搧骞垮憡鈥?/span>, 鈥?/span>閫氫俊鈥?/span>]
 20 
 21 
 22 class news(models.Model):
 23     time = models.CharField(max_length=10, blank=True, null=True)
 24     title = models.CharField(max_length=10, blank=True, null=True)
 25     category = models.CharField(max_length=200, blank=True, null=True)
 26 
 27     class Meta:
 28         db_table = "news"
 29 
 30 
 31 class newsTable(tables.Table):
 32     counter = tables.Column(verbose_name="No", empty_values=(), orderable=False)
 33     time = tables.Column(verbose_name="Time")
 34     title = tables.Column(verbose_name="Title")
 35     category = tables.Column(verbose_name="Category")
 36 
 37     def render_counter(self):
 38         self.row_counter = getattr(self, 鈥?/span>row_counter鈥?/span>, itertools.count(1))
 39         return next(self.row_counter)
 40 
 41     class Meta:
 42         model = news
 43         attrs = {
 44             "class": "info-table",
 45         }
 46         fields = ("counter", "time", "title", "category")
 47 
 48 
 49 def to_render(html_render, data, table):
 50     html_render[鈥?/span>table鈥?/span>] = table
 51     html_render[鈥?/span>category_list鈥?/span>] = category_list
 52 
 53 
 54 def table_show(request):
 55     data = news.objects.all()
 56     data = data.values(鈥?/span>time鈥?/span>, 鈥?/span>title鈥?/span>, 鈥?/span>category鈥?/span>)
 57 
 58     table = newsTable(data)
 59     RequestConfig(request, paginate={鈥?/span>per_page鈥?/span>: 100}).configure(table)
 60 
 61     html_render = {}
 62     to_render(html_render, data, table)
 63     return render(request, "index.html", html_render)
 64 
 65 
 66 # rendering "Search by Title"
 67 def news_search(request):
 68     data = news.objects.all()
 69     html_render = {}
 70 
 71     data = data.filter(models.Q(title__icontains=request.GET[鈥?/span>keywd_input鈥?/span>]))
 72     data = data.values("time", "title", "category")
 73     table = newsTable(data)  # , order_by="-time")
 74     RequestConfig(request, paginate={鈥?/span>per_page鈥?/span>: 100}).configure(table)
 75     to_render(html_render, data, table)
 76     html_render[鈥?/span>keywd_input鈥?/span>] = request.GET[鈥?/span>keywd_input鈥?/span>]
 77 
 78     return render(request, "index.html", html_render)
 79 
 80 
 81 # rendering "Filter"
 82 def news_filter(request):
 83     data = news.objects.all()
 84     html_render = {}
 85 
 86     if request.GET[鈥?/span>filter_category鈥?/span>] == 鈥?/span>All鈥?/span>:
 87         pass
 88     else:
 89         data = data.filter(models.Q(category__icontains=request.GET[鈥?/span>filter_category鈥?/span>]))
 90 
 91     data = data.values("time", "title", "category")
 92     table = newsTable(data)
 93     RequestConfig(request, paginate={鈥?/span>per_page鈥?/span>: 100}).configure(table)
 94     to_render(html_render, data, table)
 95     html_render[鈥?/span>filter_category鈥?/span>] = request.GET[鈥?/span>filter_category鈥?/span>]
 96 
 97     return render(request, "index.html", html_render)
 98 
 99 
100 def download_excel(requst):
101     data = news.objects.all()
102     print(type(data))
103     data = data.values("time", "title", "category")
104     print(type(data))
105     return render_to_csv_response(data, filename="table_download.csv")

 

鍏蜂綋鏉ョ湅杩欏潡:

# 澹版槑 django.db 鐨?model
class news(models.Model):
    time = models.CharField(max_length=10, blank=True, null=True)
    title = models.CharField(max_length=10, blank=True, null=True)
    category = models.CharField(max_length=200, blank=True, null=True)

    class Meta:
        # 澹版槑 MySQL 涓?table 鐨勫悕瀛楋紝瑕佷笉鐒跺彲鑳戒細鎵句笉鍒?/span>
        db_table = "news"


# 澹版槑 django-tables2 鐨?table
class newsTable(tables.Table):
    # verbose_name=鏄剧ず鍚嶇О
    counter = tables.Column(verbose_name="No", empty_values=(), orderable=False)
    time = tables.Column(verbose_name="Time")
    title = tables.Column(verbose_name="Title")
    category = tables.Column(verbose_name="Category")

    # 鐢ㄦ潵娓叉煋绗竴鍒楃殑璁℃暟鍣?/span>
    def render_counter(self):
        self.row_counter = getattr(self, 鈥?/span>row_counter鈥?/span>, itertools.count(1))
        return next(self.row_counter)

    class Meta:
        model = news
        attrs = {
            # 澹版槑 table 瑕佽皟鐢ㄧ殑 CSS 鏍峰紡
            "class": "info-table",
        }
        fields = ("counter", "time", "title", "category")

 

urls.py 涓粦瀹氬ソ閾炬帴:

urlpatterns = [
    path(鈥?/span>table_example鈥?/span>, views.table_show),
    url(r鈥?/span>^news_search$鈥?/span>, views.news_search),
    url(r鈥?/span>^news_filter$鈥?/span>, views.news_filter),
    url(r鈥?/span>^download_excel鈥?/span>, views.download_excel),
]

 

 4. 閰嶇疆

4.1 鍦ㄦ湰鍦?MySQL 鏁版嵁搴撲腑娣诲姞 ithome_news 杩欎釜 database;

mysql> create database ithome_news;
mysql> use ithome_news;
mysql> source /home/con/code/python/Django_MySQL_Table/ithome_news.sql

 

4.2 淇敼 Django 涓?setting.py 涓殑 database 鐨勯厤缃紝涓庝綘鏈湴鐨勬暟鎹簱 NAME / USER / PASSWORD 涓€鑷?

# Database
DATABASES = {
   鈥?/span>default鈥?/span>: {
   鈥?/span>ENGINE鈥?/span>: 鈥?/span>django.db.backends.mysql鈥?/span>,
   鈥?/span>NAME鈥?/span>: 鈥?/span>ithome_news鈥?/span>,
   鈥?/span>USER鈥?/span>: 鈥?/span>root鈥?/span>,
   ######## modify with your password here ########
   鈥?/span>PASSWORD鈥?/span>: 鈥?/span>pwd鈥?/span>,
   ################################################
   鈥?/span>CONN_MAX_AGE鈥?/span>: 3600,
   }
   }

 

4.3 鍚姩 MySQL 鏈嶅姟鍣?/p>

python3 manage.py runserver 8000

 

鎵撳紑鏈湴缃戠珯 http://127.0.0.1:8000/table_example

 

鎴栬€?/p>

python3 manage.py runserver 0.0.0.0:port

# 姣斿 python3 manage.py runserver 0.0.0.0:8777

 

鎵撳紑鏈湴缃戠珯 http://[鏈満IP]:[port]/table_example, 鍚屼竴璺敱涓嬩篃鍙互璁块棶鍒拌缃戠珯锛?/p>

鎵€浠ュ彲浠ョ敤鏉ユ惌寤? lab 鍐呰澶囩鐞嗙郴缁?nbsp; / 浜哄憳鐧昏 / KPI 灞曠ず 鍓嶇 web 缃戦〉锛?/strong>

 

# 璇峰皧閲嶄粬浜哄姵鍔ㄦ垚鏋滐紝杞浇鎴栬€呬娇鐢ㄦ簮鐮佽娉ㄦ槑鍑哄锛?/strong>http://HdhCmsTestcnblogs测试数据/AdaminXie

#   濡傛灉瀵规偍鏈夊府鍔╋紝娆㈣繋鍦?GitHub 涓?Star 鏀寔涓? https://github测试数据/coneypo/Django_MySQL_Table

# 濡傛湁闂璇风暀瑷€鎴栬€呰仈绯婚偖绠?nbsp;[email protected]锛屽晢涓氬悎浣滃嬁鎵?/strong>

查看更多关于Django+MySQL Dashboard 缃戦〉绔暟鎹簱鍙鍖?/h1>的详细内容...

  阅读:16次