1. models.py


models.py에서 사전설정을 합니다.


GAME_STATUS_CHOICES = (
    ("F""First turn Player"),
    ("S""Second turn Player"),
    ("W""First Player has Win"),
    ("L""Second Player has Win"),
    ("D""Draw")
)
cs


views.py에서 보내진 인자에 따라 models.py를 결정할 수 있게 됩니다.

각각 머리글자를 따서 튜플 형태로 작성합니다.


class GamesQuerySet(models.QuerySet):
    def games_user(self, user):
        return self.filter(
            Q(first_player=user) | Q(second_player=user)
        )
 
    def is_active(self):
        return self.filter(
            Q(status='F'| Q(status='S')
        )
 
    def drew_games(self):
        return self.filter(status='D')
cs

여기서 Q를 쓰고 filter를 바로 써 줄 수 있습니다. 좀 더 편리한 코드 작성이 가능합니다.


class Game(models.Model):
    first_turn_player = models.ForeignKey(User, on_delete=models.CASCADE, related_name="first_player")
    second_turn_player = models.ForeignKey(User, on_delete=models.CASCADE, related_name="second_player")
 
    start_datetime = models.DateTimeField(auto_now_add=True)
    end_datetime = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=1default='F', choices=GAME_STATUS_CHOICES)
 
    objects = GamesQuerySet.as_manager()
 
    def __str__(self):
        return "{0} vs {1}".format(self.first_player, self.second_player)
cs


데이터베이스 사용시엔 필연적으로 model을 지정해야 합니다.

manager도 사용해봤습니다. 그 후 이동에 관련된 모델을 지정합니다.


class Move(models.Model):
    x = models.IntegerField()
    y = models.IntegerField()
    comment = models.CharField(max_length=300, blank=True)
    by_first_player = models.BooleanField()
 
    game = models.ForeignKey(Game, on_delete=models.CASCADE)
cs


이렇게 이동하는 동작을 모델로 지정해줘도 괜찮습니다. 데이터베이스를 이용할 것이니 모델로 지정해주는 것이 ORM사용에도 유리할 것입니다.

유저의 기본정보를 묻는 모델도 만듭니다.

질문 모델은 이런식으로 할 수 있을 것입니다.


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('published')
 
    def recent_published(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1<= self.pub_date <= now
 
    recent_published.admin_order_field = 'pub_date'
    recent_published.boolean = True
    recent_published.short_description = 'recently created'
 
    def __str__(self):
        return self.question_text
cs


def recent_published(self):를 이용하여 최근에 작성되었는지에 대한 여부를 나타내는 함수를 지정했습니다.

유저는 여기에 있는 질문을 받게 됩니다. 그건 views.py를 이용해서 작성해주시면 됩니다. 

2. admin.py

admin에는 ModelAdmin class를 추가해줍니다.


@admin.register(Game)
class GameAdmin(admin.ModelAdmin):
    display = ("id""first_turn_player""second_turn_player""status")
    editable = ("status", )
 
admin.site.register(Move)
cs


게임플레이 자체는 따로 앱을 지정해서 만듭니다. views.py는 아래와 같이 쓸 수 있을 것입니다.


3. 플레이 관련 앱 - views.py


from gameplay.models import Game
 
@login_required
def home(request):
    my_games = Game.objects.games_for_user(request.user)
    active_games = my_games.active()
    drew_games = my_games.drew_games()
 
    return render(request, "home.html", {"num_games": Game.objects.count(),
                                                "games": active_games,
                                                "drew_games": drew_games})
cs


로그인한 사용자만 이용할 수 있게 한 것입니다.

active()와 drew_games()는 새로 지정해줘야합니다.

render시에 num_games에 게임의 객체의 수를 넣어줍니다. home.html에서 사용될 것입니다.


4. html 템플릿


부트스트랩을 쓰면 템플릿은 이렇게 할 수 있을 것입니다. 기본 로그인 화면입니다. 나머지 게임 화면은 원하시는대로 만드시면 됩니다. 기본 로그인 화면은 예시에 불과합니다.


    <body>
    <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation - 보이지 않는 요소입니다.</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <class="navbar-brand" href="/">게임 제목 입니다.</a>
        </div>
        <div id="navbar" class="navbar-collapse collapse">
          <form class="navbar-form navbar-right" role="form">
            <div class="form-group">
<p><h2>이메일</h2></p>
              <input type="text" placeholder="Email" class="form-control">
            </div>
            <div class="form-group">
<p><h2>패스워드</h2></p>
              <input type="password" placeholder="Password" class="form-control">
            </div>
            <button type="submit" class="btn btn-success">Sign in or Login</button>
          </form>
        </div>
      </div>
    </nav>
 
    <div class="container">
 
        {% block content %}
        {% endblock %}
 
    </div>



+ Recent posts