2015-02-06 5 views
0

Django Rest Framework에서 약간 읽었지만 구현하기가 어렵습니다. 로드 할 때 RESTful 서비스에 GET 요청을해야하는 "highscores.html"이라는 페이지가 있습니다. 그 사용자에 대한 높은 점수 목록을 리턴합니다. 관련 코드가 아래에 주어진다 :Django REST 뷰에 액세스 할 수 없습니다.

views.py :

from gamestore.serializers import ScoreSerializer 
from rest_framework.decorators import api_view 
from rest_framework.response import Response 

..

# display high scores 
@api_view(['GET']) 
def highscores(request, id): 

     print("INSIDE HIGH SCORES") 
     userobj = request.user 
     gameobj = Games.objects.get(pk=id) 
     scoreobj = Scores.objects.filter(game=gameobj, player=userobj) 

     if request.method == 'GET': 
       #print(scoreobj[0].game) 
       serializer = ScoreSerializer(scoreobj) 
       return Response(serializer.data, template_name='gamestore/highscores.html') 

models.py :

from django.contrib.auth.models import User 
from django.db import models 

class Usertypes(models.Model): 
     user = models.OneToOneField(User) 
     usertype = models.TextField() 

     def __unicode__(self): 
       return self.user_name 

class Games(models.Model): 
     name = models.CharField(max_length=100,unique=True) 
     category = models.CharField(max_length=100) 
     url = models.URLField() 
     developer = models.ForeignKey(User) 
     price = models.FloatField() 

     def __unicode__(self): 
       return self.name 

class Scores(models.Model): 
     game = models.ForeignKey(Games) 
     player = models.ForeignKey(User) 
     registration_date = models.DateField(auto_now=False, auto_now_add=False) 
     gamestate = models.TextField(blank=True, null=True) 
     high_score_1 = models.PositiveIntegerField(default=0) 
     high_score_2 = models.PositiveIntegerField(default=0) 
     high_score_3 = models.PositiveIntegerField(default=0) 
     high_score_4 = models.PositiveIntegerField(default=0) 
     high_score_5 = models.PositiveIntegerField(default=0) 
     last_score = models.PositiveIntegerField(default=0) 


     def __unicode__(self): 
       return self.game 

serializers.py :

from rest_framework import serializers 
from gamestore.models import Scores 

    class ScoreSerializer(serializers.ModelSerializer): 

      class Meta: 
        model = Scores 
        fields = ('game', 'player', 'high_score_1', 'high_score_2', 'high_score_3', 'high_score_4', 'high_score_5') 
,210

highscores.html :

$(document).ready(function(){ 
     var game = $(this); 
     var id = document.getElementById("gameid").value; 
     alert(id); 
     var csrftoken = getCookie('csrftoken'); 
     $.ajax({ 
      type : "GET", 
      url : "/highscores/", 
      data : {'id': id}, 
      dataType : "json", 
      success : function(data){ 
      console.log(data); 
     } 
     }); 
     event.preventDefault(); 

});

실제로 전체 주제에 대해 완전히 혼란스럽고 highscore.html 파일의 "최고 기록"보기에서 응답을 렌더링하는 방법을 이해할 수 없습니다. 이 서버를 실행할 때 404 찾을 수 없음 오류가 발생합니다. "높은 점수"보기는 서버에 표시되지 않으므로 분명히 액세스되지 않습니다. 튜토리얼으로,이 기사 (https://realpython.com/blog/python/django-rest-framework-quick-start/#drf-setup)를 충분히 간단하게 보았습니다. 그러나 출력, 형식 (예 : JSON) 등을 렌더링하는 것과 같은 많은 것들을 이해하지 못합니다. 누군가 도움을받을 수 있습니까? 초보자를위한 이해하기 쉬운 문서에 대한 링크조차도 유용 할 것입니다. 미리 감사드립니다!

편집 :

urls.py :

from django.conf.urls import patterns, include, url 
from django.contrib import admin 
import gamestore.views 

urlpatterns = patterns('', 
     # Examples: 
     # url(r'^$', 'wsdProject.views.home', name='home'), 
     # url(r'^blog/', include('blog.urls')), 

     url(r'^admin/', include(admin.site.urls)), 
     url(r'^$','gamestore.views.home'), 
     url(r'^login/','gamestore.views.login_view'), 
     url(r'^logout/','gamestore.views.logout_view'), 
     url(r'^registration/','gamestore.views.registration'), 
     url(r'^addgame/','gamestore.views.addgame'), 
     url(r'^devhome/','gamestore.views.devhome'), 
     url(r'^gamestats/','gamestore.views.gamestats'), 
     url(r'^savegamestate/','gamestore.views.savegamestate'), 
     url(r'^loadgamestate/','gamestore.views.loadgamestate'), 
     url(r'^editgame/(?P<id>\d+)/','gamestore.views.editgame'), 
     url(r'^delete/(?P<id>\d+)/','gamestore.views.deletegame'), 
     url(r'^loadgame/(?P<id>\d+)/','gamestore.views.loadgame'), 
     url(r'^loadhighscores/(?P<id>\d+)/','gamestore.views.loadhighscores'), 
     url(r'^highscores/(?P<id>\d+)/','gamestore.views.highscores'), 
     url(r'^gamestore/', include('gamestore.urls', namespace="gamestore")), 
     url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) 
) 
+0

urls.py 파일이 제대로 구성되어 있지 않은 것 같습니다. 궁금한 점이 있으십니까? – cziemba

+0

urls 파일이 아래에 추가되었습니다. – user3033194

+0

ajax에 의해 최고 기록을 요청하고 있지만 json 기록이 아닌 html 템플리트를 응답으로 보내고 있습니다. 조심해. – levi

답변

2

좋아요,이 URL 규칙 url(r'^highscores/(?P<id>\d+)/' 있습니다.

그래서 당신의 아약스 호출에, 당신의 URL은 "/highscores/" 그리고 당신은 그래서 당신의 최종 URL이 "/highscores/?id=some_id"처럼 보이는 그 잘못, GET 매개 변수를 사용하여 id을 보내고있다. 귀하의 URL은 다음과 같아야합니다 : "/highscores/some_id". ID를 추가해야합니다. "/highscores/"+id

$(document).ready(function(){ 
           var game = $(this); 
           var id = document.getElementById("gameid").value; 
           alert(id); 
           var csrftoken = getCookie('csrftoken'); 
           $.ajax({ 
             type : "GET", 
             url : "/highscores/"+id, 

             dataType : "json", 
             success : function(data){ 
               console.log(data); 
             } 
           }); 
           event.preventDefault(); 
         }); 

또한,보기에, 당신은 응답으로 HTML 템플릿을 보내고있다, 그것은 JSON 응답해야합니다. template_name 매개 변수 만 삭제하면됩니다.

return Response(serializer.data) 
+0

"INSIDE HIGH SCORES"라인을 출력하고 "최고 기록"보기에 액세스하는 것이 옳습니다. – user3033194

+0

@ user3033194 답이 도움이된다면, 정답으로 표시하는 수표를 클릭하십시오. – levi

+0

아, 그래, 내가 할거야. – user3033194

관련 문제