2017年11月30日 星期四

Javascript - 新增element

var tag = document.createElement('div');
var img = document.createElement('img');
img.setAttribute('class','bobo')
tag.appendChild(img);
document.getElementById("mydiv").appendChild(tag);

2017年11月25日 星期六

Django - Display Foreign Key object Fields at Admin Interface

# admin.py

class TaskDetailAdmin(admin.ModelAdmin):
    list_display = ['get_name']

    def get_name(self, obj):
        return obj.user.last_name

admin.site.register(models.Task, TaskAdmin)

2017年11月22日 星期三

Django - 分頁

from django.core.paginator import Paginator




reference:https://docs.djangoproject.com/en/1.11/topics/pagination/

Django - 設定User Model 顯示

#models.py

def get_name(self):
    return '{} {}'.format(self.last_name, self.first_name)

User.add_to_class("__str__", get_name)

2017年11月17日 星期五

Django - Message

此筆記將紀錄如何使用Django Message 功能
參考資料:https://docs.djangoproject.com/en/1.11/ref/contrib/messages/

設定預設Tag
# settigns.py

from django.contrib.messages import constants as messages
MESSAGE_TAGS = {
messages.INFO: '',
50: 'critical',
}


# views.py

from django.contrib import messages
messages.add_message(request, messages.INFO, 'Hello world.')


# template

            {% if messages %}
                {% for message in messages %}
                <p {% if message.tags %} class="bg-{{ message.tags }}"{% endif %}>{{ message }}</p>
                {% endfor %}
            {% endif %}



各種TAG

messages.debug(request, '%s SQL statements were executed.' % count)
messages.info(request, 'Three credits remain in your account.')
messages.success(request, 'Profile details updated.')
messages.warning(request, 'Your account expires in three days.')
messages.error(request, 'Document deleted.')


客制level
剛剛設定預設Tag的 50 = critical

def my_view(request):
    messages.add_message(request, 50, 'A serious error occurred.')

2017年11月13日 星期一

Python - DataTime筆記

from datetime import date

取得日期
t = date.today()

轉換字串
t.strftime('%Y%m%d') # 20171114

轉成TUPLE
tt = t.timetuple()


使用localtime()取得時間跟日期
import time

time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) 

Python - CSV筆記

參考:https://docs.python.org/3.6/library/csv.html


mode二碼
第一碼:
r -讀取
w - 檔案存在與否,均可寫入
x - 檔案不存在時,寫入
a - 檔案存在時,寫入結尾

第二碼:
t - 文字
b - 二進位



讀取

 import csv
 with open('eggs.csv', newline='') as csvfile:
     spamreader = csv.reader(csvfile, delimiter=',', quotechar=',')
     for row in spamreader:
         print(', '.join(row))


csvinstance轉換成串列

lists = []
for row in csv_instance:
    lists.append(row)


寫入

import csv
with open('eggs.csv', 'w', newline='') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter=',', quotechar=',', quoting=csv.QUOTE_MINIMAL)
    spamwriter.writerow(['001','002','003'])

如果要使用絕對路徑backslash 改成 common slash
c:\123\  to c:/123/



2017年11月11日 星期六

Django - 語系更改

以輸入中文為例:

# settings.py

import sys  
reload(sys)  
sys.setdefaultencoding('utf-8')

LANGUAGE_CODE = 'zh-hant' # Django 1.9之前zh-TW

TIME_ZONE = 'Asia/Taipei'

2017年11月10日 星期五

Django - 客製Admin



1. 修改Admin Title



新增admin資料夾至templates資料夾並新增base_site.html
取得admin templates,參考以下連結,複製內容貼在剛剛新增的base_site.html
https://github.com/django/django

django/contrib/admin/templates/admin/base_site.html

{% extends "admin/base.html" %}

{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}

{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('派工系統後台') }}</a></h1> 
{% endblock %}

{% block nav-global %}{% endblock %}


2.客制Admin ListView
首先新增一個class名字為model+admin

# admin.py

from django.contrib import admin
from . import models

class SchoolAdmin(admin.ModelAdmin):
   

記得將新增的class註冊到admin
admin.site.register(models.School, SchoolAdmin)


如要設定只需要override以下ModelAdmin變數

設定ListView欄位名稱排序
 fields = ['field1','field2','field3'] # 左至右

設定ListView搜尋功能
search_fields = ['field1','field2'] # 如此field1, field2都可以搜尋到

設定ListView Filter
list_filter = ['field1','field2']

設定ListView顯示欄位
list_display = ['field1','field2']

設定ListView欄位編輯
list_editable = ['field1','field2']






Bootstrap - Navbar筆記

Bootstrap js cdn 放在body最底部

Django - Dynamic URL

# views.py

from django.shortcuts import render
from .models import Post


def post_detail(request, pk):
    post = Post.objects.get(pk=pk)
    return render(request, 'post.html', {'post': post})


# urls.py

url(r'^post/(?P<pk>\d+)/$', post_detail, name='post_detail'),
url(r'^send_message/(?P<user_id>[\w]+)/(?P<text>\w+)/$', views.send_message, name="send_message"),


2017年11月9日 星期四

Django - Line Message API 筆記

from django.conf import settings
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden
from django.views.decorators.csrf import csrf_exempt

from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError, LineBotApiError
from linebot.models import MessageEvent, TextSendMessage, TextMessage, FollowEvent

line_bot_api = LineBotApi('Channel access token')
handler = WebhookHandler('Channel secret')

# member_ids_res = line_bot_api.get_group_member_ids(group_id)

@handler.add(MessageEvent, message=TextMessage)
def handle_text_message(event):
    # print('room_id: {}'.format(event.room_id))
    print('text: {}'.format(event.message.text))
    text =event.message.text.lower()
    user = event.source.user_id
    print('user_id: {}'.format(user))
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text=user)
    )

@handler.add(FollowEvent)
def handle_follow(event):
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text='感謝這位兄長加我')
    )


@handler.default()
def default(event):
    print(event)
    line_bot_api.reply_message(
        event.reply_token,
        TextSendMessage(text='Currently Not Support None Text Message')
    )


@csrf_exempt
def callback(request):
    if request.method == 'POST':
        signature = request.META['HTTP_X_LINE_SIGNATURE']
        body = request.body.decode('utf-8')

        try:
            handler.handle(body, signature)
        except InvalidSignatureError:
            return HttpResponseForbidden()
        except LineBotApiError:
            return HttpResponseBadRequest()
        return HttpResponse()
    else:
        return HttpResponseBadRequest()

def send_message(request):
    line_bot_api.multicast(['to1', 'to2','to3'], TextSendMessage(text='各位都是帥哥!'))
    # line_bot_api.push_message('to1', TextSendMessage(text='Hello World!'))
    return HttpResponse()

Django - CBV筆記

之前這筆記都是使用FBV(Function Based Views),以下與CBV(Class Based Views)做對照:

#FBC
def index(request):
    return render(request, 'index.html')

#CBV
class IndexView(TemplateView):
    template_name = 'index.html'


快速體驗CBV

# views.py
from django.views.generic import View

class CBView(View):
def get(self, request):
return HttpResponse('Class Based View are Cool!')

# urls.py
from basic_app import views

url(r'^$', views.CBView.as_view()),



TemplateView應用

from django.views.generic import TemplateView

# views.py
class IndexView(TemplateView):
    template_name = 'index.html'

    # for injection
    def get_context_data(self,**kwargs): # 雙*代表字典,單*代表Tuple
     context = super(IndexView, self).get_context_data(**kwargs)
     context['injectme'] = 'Basic Injection!'
     return context
    
#urls.py
url(r'^$', views.IndexView.as_view()),





ListView應用

from django.views.generic import ListView

class SchoolListView(ListView):
context_object_name = 'schools' # 沒有使用context_object_name django將預設成 school_list
model = models.School



DetailView應用



from django.views.generic import DetailView

class SchoolDetailView(DetailView):
context_object_name = 'school_detail' # 未設定
model = models.School
template_name = 'basic_app/school_detail.html'


url(r'^(?P<pk>\d+)/$', views.SchoolDetailView.as_view(),name='detail'),



CreateView應用

class SchoolCreateView(CreateView):
fields = ('name', 'principal', 'location')
model = models.School
之後要記得去School Model 加上get_absolute_url設定轉換的頁面
url(r'^create/$', views.SchoolCreateView.as_view(), name='create'),



UpdateView應用

class SchoolUpdateView(UpdateView):
fields = ('name','principal')
model = models.School

url(r'^update/(?P<pk>\d+)/$', views.SchoolUpdateView.as_view(),name='update'),


DeleteView應用