supergravity

Django Admin 페이지 그래프 만들기 graph - 검색 기록 데이터 저장 및 그래프 본문

개발중 기억해야 할만한 것들/파이썬

Django Admin 페이지 그래프 만들기 graph - 검색 기록 데이터 저장 및 그래프

supergravity 2021. 3. 1. 05:12

해야 하는 것

 

사용자가 검색을 한 데이터를 저장을 하여 나중에 분석을 하기 위하여 사용하려 한다. 현재까지 구글 파이어 베이스를 사용하였지만.. 부족한 느낌이다. 그래서 따로 데이터 베이스에 정리하여 저장하려 한다. 

 

구현을 위한 준비

 

현재 2개의 서버 중 댓글 기능을 위하여 사용하고 있는 서버를 사용할 생각이다. 

데이터 저장 시 사용자의 정보와 검색어 그리고 시간을 기록해야 한다. 

사용자 정보는 디바이스에서 redux에 저장된 내용 모두를 사용할 것이다. 

사용자 정보 그리고 검색어를 디바이스에서 json 형식으로 보내고 서버에서는 생성된 시작을 기록을 할 것이다.

 

NOTE : 위치에 대한 정보도 고민을 해봐야 할 것 같다. 그 이유는 처음 앱을 개발할 당시 마트에서 식품을 검색하는 소비자를 타깃으로 해였기 때문에 가정이 타당한지 검토를 해야 한다. 

 

구현

 

model

from django.db import models
from datetime import timezone
class SearchHistory(models.Model):
    id = models.CharField(max_length=300)
    name = models.CharField(max_length=500)
    searhkey = models.CharField(max_length=500)
    created_date = models.DateTimeField(auto_now_add=True)

serializer

from rest_framework import serializers
from .models import SearchHistory
from rest_framework.response import Response

class SearchHistorySerializer(serializers.ModelSerializer):
    class Meta:
        model = SearchHistory
        exclude = ()

view

from rest_framework.viewsets import ModelViewSet
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.response import Response
  
from history.serializer import SearchHistorySerializer
from history.models import SearchHistory  

class SearchHistoryViewSet(ModelViewSet):

    queryset = SearchHistory.objects.all()
    serializer_class = SearchHistorySerializer
    
    @action(detail=False, methods=["post"])
    def comment_post(self, request):
        id = request.data.get('id',None)
        name = request.data.get('name',None)
        searchkey = request.data.get('searchkey',None)
        try:
            history =SearchHistory(id=id, name=name, searchkey=searchkey)
            history.save()
            return Response(status=status.HTTP_200_OK)
        except ValueError:

admin

from django.contrib import admin
from foodcomments.models import SearchHistory

class SearchHistoryAdmin(admin.ModelAdmin):

    fields = ['id','name','searchkey','created_date',]

    search_fields = ('food',)

admin.site.register(SearchHistory, SearchHistoryAdmin)

 

admin graph

1. 기본

어드민에서 데이터의 그래프를 그리기 위해서는 기존에 작성된 어드민 template를 override 해야 한다. 그러기 위해서 통상적으로 admin directory를 templates directory안에 생성한다. 그러고 나서 setting.py안에 있는 TEMPLATES를 설정해주어야 한다. 아래의 코드는 setting.py 중 일부이다. 

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

위의 코드는 templates라는 폴더가 root(base_dir) 폴더 아래 존재하고 installed app 중 하나의 앱을 override 할 수 있음을 의미한다. templates folder안에 admin을 생성하고 overide 할 파일을 생성하면 된다.

 

만약 admin의 change_list.html을 override 하고 싶으면  위의 TEMPLATES와 아래와 같은 파일 트리를 구성해야 한다.  

projectname/
    templates/
        admin/
         app/
            model/change_list.html
            

 

chantge_list파일은 아래와 같인 Jinja 2를 이용하여 작성하면 된다. changelist_view의링크로 들어가서 위치를 확인해 보자.

{% extends "admin/change_list.html" %}
{% load static %}
{% block content %}

<h1>Custom message!</h1>

<!-- Render the rest of the ChangeList view by calling block.super -->
{{ block.super }}
{% endblock %}

정확한 설명은 아래의 링크에서 찾아볼 수 있다. 

docs.djangoproject.com/en/3.1/howto/overriding-templates/

 

Overriding templates | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

2. 그래프

그래프를 chantge_list에 그리기 위해서는 데이터를 chantge_list에 보내 줘야 합니다.

ModelAdmin class에는 changelist_view  

라는 메서드가 존재합니다. changelist를 override 해서 데이터를 뿌리고 Jinja를 이용하여 그래프를 그리면 끝입니다. 

changelist_view를 override하는 예시를 보면

@admin.register(SearchHistory)
class SearchHistoryAdmin(admin.ModelAdmin):
    list_display = ("id", "name", "created_date","searchkey",)
    ordering = ("-created_date",)

    def changelist_view(self, request, extra_context=None):
        data = SearchHistory.object.all()
        data_json = make_data_to_json(data)
        return super().changelist_view(request, extra_context=data_json)

admin 페이지 home에서 SearchHistory를 클릭하게 되면 override 한 changelist_view함수가 실행됩니다. 그리고 data_json을 extra_context에 argument로 제공을 해주면  chantge_list에서 data를 사용할수 있습니다. 그래프를 그리기 위한 데이터를 가공하려는 법은 아래 링크를 참고하면 된다. 

docs.djangoproject.com/en/3.1/topics/db/aggregation/

 

Aggregation | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

그래프의 경우 처음부터 디자인 할필요없다. 나의 경우 구글 chart api를 사용하였다. 아래의 링크로 들어가서 마음에 드는 차트를 골라서 사용하면 편하다. 

developers-dot-devsite-v2-prod.appspot.com/chart/interactive/docs/gallery/linechart.html

 

 

 

findwork.dev/blog/adding-charts-to-django-admin/

 

Adding charts to Django admin

Extend Django admin to add Javascript charts without any third party apps.

findwork.dev

 

Comments