在DetailView django中的方法get中通过GET获取变量

时间:2015-01-21 23:55:04

标签: django django-class-based-views detailview

我试图获得变量" segundos"通过详细信息视图中的GET,我试图通过方法得到它:

js文件:

$(document).ready(function(){
    var segundos=340;
    console.log(segundos);
    $.ajax({
        data : {'segundos':segundos},
        url : '/ajax/puzzle-1/',
        type : 'GET',    
    });
});

views.py

class PuzzleView(DetailView):
    model = Puzzle
    template_name = 'puzzle.html'

    def get (self,request,*args,**kwargs):
        seconds = request.GET["segundos"]
        self.object = self.get_object()
        ranking = Ranking.objects.create(puzzle_id=self.object.id,usuario=self.request.user,segundos=seconds,puesto=89)
        context = self.get_context_data(object=self.object)
        return self.render_to_response(context) 

class RankingView(ListView):
    model = Ranking
    template_name = 'ranking.html'
    queryset = Ranking.objects.filter(puzzle_id=1).order_by('segundos')[:3]

class PuzzleAjaxView(TemplateView):
    template_name = 'ranking.html'

但我得到了着名的错误" MultiValueDictKeyError"。如果我尝试相同的方法"得到"但是使用TemplateView,我可以获取变量,但不能使用DetailView

以防万一,我的urls.py:

urlpatterns = patterns('puzzle.views',
    url(r'^actividad/puzzle/(?P<slug>[-_\w]+)/$',PuzzleView.as_view(),name='puzzle'),
    url(r'^ajax/puzzle-1/.*$', PuzzleAjaxView.as_view(),name='ajax'),
    url(r'^ranking/.*$', RankingView.as_view(),name='ranking'),

    )

1 个答案:

答案 0 :(得分:3)

 seconds = request.GET("segundos")

您无法拨打GET MultiValueDict。您必须通过字典查找进行访问。它是dict

的子类
request.GET.get('segundos')
request.GET['segundos']

更新

为了将来参考,您的异常回溯可以解释所有这些,但错误消息应该非常清楚:segundos中的某些内容不是MultiValueDict中的有效密钥。< / p>

我假设您的PuzzleView(您称之为DetailView)永远不会传递任何GET参数,因为您的示例仅显示您的AJAX调用GET参数,该调用映射到您的{{1} (你称之为PuzzleAjaxView

根据您的观看类是TemplateView还是get的事实,确定您的TemplateView功能是否有效的决定因素是什么?&#39;事实上DetailView只传递给你的AJAX视图。

换句话说..任何视图(segundos,无关紧要)通过直接查找TemplateView, DetailView访问GET dict将失败,如果该获取参数不是&#39;传入。