자격증 & 문제풀이/Django-Project

[Django] Game Model과 Game 등록(create)

YSY^ 2020. 7. 19. 22:46

 

 

Game 앱은 게임리스트와 각종필터 그리고 게임정보 페이지를 만드는데 이용됩니다.

먼저 python manage.py startapp game 으로 game 앱을 만듭니다.

 

■ Models.py

Game과 Genre_list 두개의 class를 만듭니다.

▶ Game class

1. title(게임타이틀)

2. app_id(게임id) -> 게임정보 가격비교쪽에서 steam사이트의 게임정보로 바로 갈때 필요

3. genre(장르), developer(개발사), release_at(공개일자), info(게임정보)

4. pc_requirement_mimimum(최저사양), pc_requirement_recommended(추천사양)

5. steam, origin, uplay, epic_games, drmfree : 유통사별 가격정보

6. video : 유튜브 영상 링그를 넣는 변수입니다.

7. thumbnail : 게임리스트에서 보여줄 게임에 대한 사진을 넣는 변수입니다.

 

▶ Genre_list는 말그대로 게임의 장르들을 넣는 class입니다.

썸네일과 유튜브비디오 재생을 구현하려면 패키지 설치가 필요합니다. 프롬포트를 열고 다음과 같은 코드를 입력하여 패키지를 설치하여야 합니다.

pip install pillow
pip install pilkit
pip install django-imagekitpip install django-embed-video

 

from django.db import models
# 썸네일관련 import입니다.
from imagekit.models import ProcessedImageField
from imagekit.processors import ResizeToFill

#유튜브 영상 관련 import입니다.
from embed_video.fields import EmbedVideoField

from config import settings



class Game(models.Model):
    app_id = models.IntegerField(verbose_name= 'app_id', null=True, blank = True)
    title = models.CharField(verbose_name='title', max_length=100)
    # price = models.IntegerField(verbose_name='price')
    genre = models.CharField(verbose_name='genre', max_length=100)
    developer = models.CharField(verbose_name='developer', max_length=100)
    release_at = models.DateTimeField(verbose_name='release Day') 
    info = models.TextField(verbose_name='info')
    pc_requirements_minimum = models.CharField(verbose_name='pc_requirements_minimum',max_length=1000,null=True, blank=True)
    pc_requirements_recommended = models.CharField(verbose_name='pc_requirements_recommended',max_length=1000,null=True, blank=True)
    mac_requirements_minimum =  models.CharField(verbose_name='mac_requirements_minimum',max_length=1000,null=True, blank=True)   
    mac_requirements_recommended =  models.CharField(verbose_name='mac_requirements_recommended',max_length=1000,null=True, blank=True) 
    linux_requirements_minimum =  models.CharField(verbose_name='linux_requirements_minimum',max_length=1000,null=True, blank=True)   
    linux_requirements_recommended =  models.CharField(verbose_name='linux_requirements_recommended',max_length=1000,null=True, blank=True)
    video = EmbedVideoField(null=True)
    # 썸네일
    thumbnail = ProcessedImageField(
		upload_to = 'thumbnail',					# 저장 위치
		processors = [ResizeToFill(220, 70)], # 사이즈 조정
		format = 'JPEG',					# 최종 저장 포맷
		options = {'quality': 80},
        blank =True)  		# 저장 옵션
    # 게임 퍼블리셔
    steam = models.IntegerField(verbose_name= 'steam', null=True, blank = True)
    origin = models.IntegerField(verbose_name= 'origin', null=True, blank = True)
    uplay = models.IntegerField(verbose_name= 'uplay', null=True, blank = True)
    epic_games = models.IntegerField(verbose_name= 'epic_games', null=True, blank = True)
    drmfree = models.IntegerField(verbose_name= 'drmfree', null=True, blank = True)
    like_users = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='like_game')


    def __str__(self):
        return self.title
        
	# title로 정렬
    class Meta:
        ordering = ["title"]
        

class Genre_list(models.Model):
    genre_list = models.CharField(verbose_name='genre_list', max_length=100)

    def __str__(self):
        return self.genre_list

 

■ forms.py

게임 create 폼을 만들기 위한 과정입니다.

먼저 game 앱에 forms.py 파일을 만듭니다.

그리고 genre_choice를 ModelMultipleChoiceField을 이용하여 체크박스 형식으로 반듭니다.

참고로, ModelMultipleChoiceField은 모델폼에서 여러개를 변경해야할 때 쓰이는 함수입니다.

그다음으로는 Meta class를 만들고 fields 변수에 게임을 만드는 변수들을 순서대로 입력합니다. 

그리고 save함수에서는 선택한 장르들을 데이터형식에 맞게 만들어주는 함수입니다.

우리의 게임데이터의(추후에 나옵니다.) 장르 형식은 RPG/Adventure/SPORT 이런식으로 되어있습니다.

하지만 체크박스로 장르를 넘기게 되면 ['RPG','Adventure'.'SPORT'] 형식으로 넘어옵니다.

이렇게 리스트 형식으로 넘어온 것을 for문을 이용해 중간중간에 '/'을 삽입해서  RPG/Adventure/SPORT형식으로 만드는 것입니다.

from django import forms
from .models import Game, Genre_list

class GameCreateForm(forms.ModelForm):
	#장르들을 체크박스로 정렬하여 선택할 수 있게 한다.
    genre_choice = forms.ModelMultipleChoiceField(queryset=Genre_list.objects.all(),
                                                  widget=forms.CheckboxSelectMultiple())

    class Meta:
        model = Game
        #### 참고 : fields 와 exclude 이용법 #####
        # fields = "__all__"
        # fields = ['title','content']
        # exclude = ['title'] #title 필드만 빼고 나머지 필드드로로 Form Field를 생성
        fields = ['title','genre_choice','developer','release_at','info','pc_requirements_minimum','pc_requirements_recommended',
                'thumbnail','steam','origin','uplay','epic_games','drmfree','video']
    
    
    def save(self, commit=True):
        # genre 리스트 읽어 하나의 문자열로 변환 뒤 Game(모델)의 genre에 추가
        game = self.instance #모델 조회
        genre_list = '/'.join([qs.genre_list for qs in self.cleaned_data['genre_choice']])
        # print(genre_list)
        # Game 모델에 genre 추가
        game.genre = genre_list
        game.save()#모델.salve() => insert
        # print(game.name, game.price, game.genre)
        return game                

 

■ Admin.py 

admin에서는 이전에 만든 모델들을 등록해줍니다. 

from django.contrib import admin
from . import models
from embed_video.admin import AdminVideoMixin

# 유튜브 비디오 재생을 위한 class
class GameAdmin(AdminVideoMixin, admin.ModelAdmin): 
    list_display = ('title','video') 

admin.site.register(models.Game, GameAdmin)
admin.site.register(models.Genre_list)

 

■ views.py

CreateView를 이용하여 게임을 만드는 view를 만듭니다.

from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
from .models import Game, Genre_list
from .forms import GameCreateForm
from django.shortcuts import  redirect, render

class GameCreateView(CreateView):
    template_name = 'game/game_create.html'
    form_class = GameCreateForm
    # success_url = reverse_lazy('board:list') #class에서 sucessurl에서는 reverselazy써야함

    def get_success_url(self):
        return reverse('game:detail',args=[self.object.pk]) #self.object : insert한 모델객체

 

■ urls.py 

urls.py 파일을 만들고 url을 등록시켜줍니다.

from django.urls import path

from . import views

app_name = 'game'
urlpatterns = [
    path('create/', views.GameCreateView.as_view(), name='create'),
    path('<int:pk>/create/', views.game_delete, name='delete'),
]

 

■ game_create.html

game엡에 templates/game폴더를 만들고 해당폴더에 game._create.html 파일을 만듭니다.

genre_choice를 for문을 이용하여 체크박스 형식으로 하나씩 보여줍니다.

genre_choice가 아니라면 label : field 형식으로 보여줍니다.

{% extends 'base.html' %}

{% block title %}  GAME REGISTER {% endblock title %}

{% block content %}
<form method="post">
    {%csrf_token%}
 
    <form method="post">
        {% csrf_token %}
        {% for field in form%}
            
            {% if field.name != 'genre_choice'%}
                <p>{{field.label}} : {{field}}</p>
            {%else %}
                <p>
                {{field.label}} : 
                {% for check in form.genre_choice %}
                    {{check}}
                {% endfor %}
                </p>
            {% endif %}
        {% endfor%}
        <p>
            <button class = 'btn btn-primary' type = 'submit'> REGISTERATION </button>
        </p>

    </form>
</form>


{% endblock content %}

 

■ config 작업

settings.py의 Installed_apps에  'imagekit', (# 썸네일)    'embed_video',(# 유튜브 API)을 추가시킵니다.

그리고 urls.py의 urlpatterns에 

    path('accounts/', include('accounts.urls')),

를 추가시킵니다.

 

■ 결과물

한증막.GG 페이지에서의 게임등록
admin에서의 게임등록(like user는 좋아요 기능을 위한 것으로 추후 포스팅하겠습니다.)

 

다음 포스팅에서는 게임등록을 했을시 수정/업데이트가 가능하도록 하는 것을 하겠습니다.

 

https://coupa.ng/bQ4xoT

 

이엠텍 지포스 RTX 3070 BLACK Edition OC D6 8GB 그래픽카드

COUPANG

www.coupang.com

 

728x90
반응형

'자격증 & 문제풀이 > Django-Project' 카테고리의 다른 글

[Django] Django와 데이터 연동  (0) 2020.07.19
[Django] Game Update와 Delete  (0) 2020.07.19
[Django] Base.html  (0) 2020.07.19
[Django] Home.html  (0) 2020.07.19
[Django] 한증막.GG 사이트 설명  (0) 2020.07.19