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=1, default='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> <a 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> |
'Python' 카테고리의 다른 글
[django] django에서 DoesNotExist와 인증 Backend 만들기 (0) | 2018.02.07 |
---|---|
[django] django 에서 recaptcha 사용 (0) | 2018.02.05 |
[django] GeoDjango 와 django-rest-framework 연동 (0) | 2018.02.04 |
[django] GeoDjango를 쓰기 위한 model과 view 설정 (0) | 2018.02.03 |
[django] Django-pipeline 쓰기 (0) | 2018.02.03 |