【问题标题】:get a variables by GET in method get in DetailView django在 DetailView django 中通过 GET 方法获取变量
【发布时间】:2015-03-20 16:09:47
【问题描述】:

我试图在详细视图中通过 GET 获取变量“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”。如果我尝试使用相同的方法“get”但使用 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'),

    )

【问题讨论】:

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


    【解决方案1】:
     seconds = request.GET("segundos")
    

    你不能只打电话给GETMultiValueDict。您必须通过字典查找访问。它是dict 的子类。

    request.GET.get('segundos')
    request.GET['segundos']
    

    更新

    为了将来参考,您的异常回溯可以解释所有这些,但错误消息应该非常清楚:类似于segundos 的内容不是MultiValueDict 中的有效键。

    我假设您的 PuzzleView(您所称的 DetailView)永远不会传递任何 GET 参数,因为您的示例仅通过 AJAX 调用显示 GET 参数,该调用映射到您的 PuzzleAjaxView(您在调用TemplateView

    决定你的get 函数是否工作的不是基于你的视图类是TemplateView 或DetailView,而是segundos 只传递给你的AJAX 视图。

    换句话说.. 如果未传入该 get 参数,则通过直接查找 request.GET['foobar'] 访问 GET dict 的任何视图(TemplateView, DetailView,无关紧要)都将失败。

    【讨论】:

    • 您还想做request.GET.get('segundos', False),这样您的应用程序在用户调用它而不设置该GET 变量时不会抛出异常。另外,我建议您用英文命名变量。
    • @dan-klasson get 的目的之一是确保它不会抛出异常。没有第二个参数的默认值为None。 docs.python.org/2/library/stdtypes.html#dict.get
    • @Yuji'Tomita'Tomita 对不起,我的代码带有 ['segundos'],当我粘贴我的代码时,我做了一些修改,已经编辑过了,但无论如何它不能像这样工作
    • @dan-klasson 嗨,不,它确实像这样工作,因为第二个参数以“无”传递为空,我得到错误的任何其他线索?
    • @dan-klasson 抱歉,你是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2012-10-11
    • 2014-02-20
    • 2018-04-02
    • 2012-03-13
    • 2021-10-08
    相关资源
    最近更新 更多