プロフィール画面に必要なデータ
マイページには「ユーザー名」「住所」「最近見た商品」が必要です。
- 住所は Address モデルから
request.user.address_set.latest('create_time')で取得 - 閲覧履歴は Redis のリスト型で保存し、ログアウト後も保持
Redis キー設計
history_<user_id> = [sku_id, sku_id, ...]
ビュー実装
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import View
from django.shortcuts import render
from django_redis import get_redis_connection
from goods.models import GoodsSKU, Address
class ProfileView(LoginRequiredMixin, View):
def get(self, request):
user = request.user
try:
latest_addr = user.address_set.latest('create_time')
except Address.DoesNotExist:
latest_addr = None
r = get_redis_connection('default')
sku_ids = r.lrange(f'history_{user.id}', 0, 4)
viewed = []
for sku_id in sku_ids:
try:
viewed.append(GoodsSKU.objects.get(id=sku_id))
except GoodsSKU.DoesNotExist:
continue
return render(request, 'user_center_info.html', {
'address': latest_addr,
'skus': viewed,
})
URL 設定
url(r'^profile$', views.ProfileView.as_view(), name='profile')
テンプレート例
{% for sku in skus %}
<li>
<a href="{{ sku.get_absolute_url }}">
<img src="{{ sku.default_image.url }}" alt="{{ sku.name }}">
</a>
<h4>{{ sku.name }}</h4>
<span>¥{{ sku.price }}</span>
</li>
{% endfor %}
FastDFS カスタムストレージ
Django のデフォルトストレージを FastDFS に差し替える手順。
依存パッケージ
pip install fdfs_client-py-master.zip
カスタムストレージクラス
# utils/fastdfs/storage.py
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client
from django.conf import settings
class FastDFSStorage(Storage):
def __init__(self, conf_path=None, base_url=None):
self.conf_path = conf_path or settings.FASTDFS_CLIENT_CONF
self.base_url = base_url or settings.FASTDFS_BASE_URL
def _save(self, name, content):
client = Fdfs_client(self.conf_path)
ret = client.upload_by_buffer(content.read())
if ret.get('Status') != 'Upload successed.':
raise IOError('FastDFS upload failed')
return ret['Remote file_id']
def _open(self, name, mode='rb'):
# ファイルの読み出しは URL で行うため pass
pass
def exists(self, name):
# FastDFS では同名ファイルは自動リネームされるため常に False
return False
def url(self, name):
return self.base_url + name
設定値追加
# settings.py
DEFAULT_FILE_STORAGE = 'utils.fastdfs.storage.FastDFSStorage'
FASTDFS_CLIENT_CONF = os.path.join(BASE_DIR, 'utils/fastdfs/client.conf')
FASTDFS_BASE_URL = 'http://192.168.228.135:8888/'
動作確認
>>> from goods.models import GoodsCategory
>>> c = GoodsCategory.objects.get(id=1)
>>> c.image.url
'http://192.168.228.135:8888/group1/M00/00/00/CtM3BVnkILGACHh0AAAmv27pX4k2790330'
tinymce 導入(リッチテキスト)
pip install django-tinymce==2.6.0
# settings.py
INSTALLED_APPS += ['tinymce']
TINYMCE_DEFAULT_CONFIG = {
'theme': 'advanced',
'width': 600,
'height': 400,
}
# urls.py
urlpatterns += [url(r'^tinymce/', include('tinymce.urls'))]