属性错误:'tuple'对象没有'get'属性。

21
我有一个Django应用程序。但是我一直在与一个错误斗争,一直找不到解决办法。
Exception Value: 'tuple' object has no attribute 'get'

Exception Location: /Library/Python/2.7/site-packages/django/middleware/clickjacking.py in process_response, line 30

这是 Django 提供给我的回溯信息。

Traceback:
File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in get_response
201.                 response = middleware_method(request, response)
File "/Library/Python/2.7/site-packages/django/middleware/clickjacking.py" in process_response
30.         if response.get('X-Frame-Options', None) is not None:

我很难弄清楚为什么会出现这个错误。我该如何找出我的代码中那个tuple所在的位置?

视图:

def products(request, category=None, gender=None, retailer_pk=None, brand_pk=None):
    # If the request it doesn't have a referer use the full path of the url instead.
    if not request.META.get("HTTP_REFERER", None):
        referer = request.get_full_path()
    else:
        referer = request.META.get("HTTP_REFERER")

    if gender:
        products = ProductSlave.objects.filter(Q(productmatch__stockitem__stock__gt=0) &
                                               Q(productmatch__slave_product__master_product__gender=gender)).distinct()
    elif brand_pk:
        products = ProductSlave.objects.filter(Q(master_product__brand__pk=brand_pk))
        brand = Brand.objects.get(pk=brand_pk)
    elif retailer_pk:
        retailer = Retailer.objects.get(pk=retailer_pk)
        products = retailer.productmatch_set.all()
    else:
        products = ProductSlave.objects.filter(Q(productmatch__stockitem__stock__gt=0))

    if not retailer_pk:
        filt = create_filtering(productslaves=products, request=request)
    elif retailer_pk:
        filt = create_filtering(productmatches=products, request=request)

    sorting_selected = request.GET.get("sorter", None)

    # q_list is used to store all the Q's
    # Then they are reduced. And then filtered
    if "brand" in request.GET:
        brand_filtering = request.GET.get("brand", None)
        if brand_filtering:
            brand_filtering = brand_filtering.split("|")
        q_list = []
        for filter in brand_filtering:
            if retailer_pk:
                q_list.append(Q(slave_product__master_product__brand__slug=filter))
            else:
                q_list.append(Q(master_product__brand__slug=filter))
        reduced_q = reduce(operator.or_, q_list)
        products = products.filter(reduced_q)

    if "kategori" in request.GET:
        category_filtering = request.GET.get("kategori", None)
        if category_filtering:
            category_filtering = category_filtering.split("|")
        q_list = []
        for filter in category_filtering:
            if retailer_pk:
                q_list.append(Q(slave_product__master_product__product_category__slug=filter))
            else:
                q_list.append(Q(master_product__product_category__slug=filter))
        reduced_q = reduce(operator.or_, q_list)
        products = products.filter(reduced_q)

    if "stoerrelse" in request.GET:
        size_filtering = request.GET.get("stoerrelse", None)
        if size_filtering:
            size_filtering = size_filtering.split("|")
        q_list = []
        for filter in size_filtering:
            if retailer_pk:
                q_list.append(Q(slave_product__productmatch__stockitem__size__pk=filter))
            else:
                q_list.append(Q(productmatch__stockitem__size__pk=filter))
        reduced_q = reduce(operator.or_, q_list)
        products = products.filter(reduced_q)

    if "farve" in request.GET:
        color_filtering = request.GET.get("farve", None)
        if color_filtering:
            color_filtering = color_filtering.split("|")
        q_list = []
        for filter in color_filtering:
            if retailer_pk:
                q_list.append(Q(slave_product__sorting_color__slug=filter))
            else:
                q_list.append(Q(sorting_color__slug=filter))
        reduced_q = reduce(operator.or_, q_list)
        products = products.filter(reduced_q)

    if "pris" in request.GET:
        price_filtering = request.GET.get("pris", None)
        if price_filtering:
            price_filtering = price_filtering.split("|")
        q_list = []
        if retailer_pk:
            q_list.append(Q(price__gte=price_filtering[0]))
            q_list.append(Q(price__lte=price_filtering[1]))
        else:
            q_list.append(Q(productmatch__price__gte=price_filtering[0]))
            q_list.append(Q(productmatch__price__lte=price_filtering[1]))
        reduced_q = reduce(operator.and_, q_list)
        products = products.filter(reduced_q)

    if sorting_selected:
        if sorting_selected == filt["sorting"][0]["name"]:
            filt["sorting"][0]["active"] = True
            if retailer_pk:
                products = products.annotate().order_by("-price")
            else:
                products = products.annotate().order_by("-productmatch__price")
        elif sorting_selected == filt["sorting"][1]["name"]:
            if retailer_pk:
                products = products.annotate().order_by("price")
            else:
                products = products.annotate().order_by("productmatch__price")
            filt["sorting"][1]["active"] = True
        elif sorting_selected == filt["sorting"][2]["name"]:
            filt["sorting"][2]["active"] = True
            if retailer_pk:
                products = products.order_by("pk")
            else:
                products = products.order_by("pk")
        else:
            if retailer_pk:
                products = products.order_by("pk")
            else:
                products = products.order_by("pk")
    else:
        if retailer_pk:
            products = products.order_by("pk")
        else:
            products = products.order_by("pk")

    if brand_pk:
        return render(request, 'page-brand-single.html', {
            'products': products,
            "sorting": filt["sorting"],
            "filtering": filt["filtering"],
            "brand": brand,
        })
    elif retailer_pk:
        return (request, 'page-retailer-single.html', {
            "products": products,
            "sorting": filt["sorting"],
            "filtering": filt["filtering"],
            "retailer": retailer,
        })
    else:
        return render(request, 'page-product-list.html', {
            'products': products,
            "sorting": filt["sorting"],
            "filtering": filt["filtering"]
        })

1
你可以将这两行代码 if "pris" in request.GET: price_filtering = request.GET.get("pris", None) 替换为 price_filtering = request.GET.get('pris', None),因为使用 get 方法时不需要进行第一次成员资格检查,它永远不会引发异常。 - Burhan Khalid
8个回答

72

这里返回了一个元组:

elif retailer_pk:
    return (request, 'page-retailer-single.html', {
        "products": products,
        "sorting": filt["sorting"],
        "filtering": filt["filtering"],
        "retailer": retailer,
    })

你是不是忘了添加render函数:

elif retailer_pk:
    return render(request, 'page-retailer-single.html', {
        "products": products,
        "sorting": filt["sorting"],
        "filtering": filt["filtering"],
        "retailer": retailer,
    })

7

在编写视图函数时,确保在'return'后面加上render函数。

在我的情况下,我没有添加 return render(request, app_name/index.html。花了我很长时间才找到这个错误,甚至stackoverflow上的答案也没有提到它,这就是为什么我在这里发布的原因。

{IMAGE} 检查index和register函数以及它们下面指示的错误。


7
views.py中的return函数末尾多了一个逗号","。
return render(request, 'index.html',{}), #incorrect

return render(request, 'index.html',{}) #correct

1

你忘记在 return 后面添加 render,所以你只需要在 return 后面添加 render

你写的部分(看最后一个 elif):

elif retailer_pk:
    return (request, 'page-retailer-single.html', {
        "products": products,
        "sorting": filt["sorting"],
        "filtering": filt["filtering"],
        "retailer": retailer,
    })

但这将是:

elif retailer_pk:
    return render(request, 'page-retailer-single.html', {
        "products": products,
        "sorting": filt["sorting"],
        "filtering": filt["filtering"],
        "retailer": retailer,
    })

1
即使将视图中的逗号去掉也是一种简单的解决方案,就像这样。
def home(request):
    return render(request, 'index.html')

def hire(request):
    return render(request, 'hire.html')

def handler400(request, exception):
    return render(request, '400.html', locals())

def handler403(request, exception):
    return render(request, '403.html', locals())

def handler404(request, exception):
    return render(request, '404.html', locals())

def handler500(request, exception):
    return render(request, '500.html', locals())

不是这样的。
def home(request):
    return render(request, 'index.html'),

def hire(request):
    return render(request, 'hire.html'),

def handler400(request, exception):
    return render(request, '400.html', locals()),

def handler403(request, exception):
    return render(request, '403.html', locals()),

def handler404(request, exception):
    return render(request, '404.html', locals()),

def handler500(request, exception):
    return render(request, '500.html', locals())

0
Had a similar problem and discovered that the error was from the spacing between the function name and the request

I did this : 
def greet (request, name):
    return render(request, "hello/greet.html", {
        "name": name. Capitalize()
    })

instead of this:
def greet(request, name):
    return render(request, "hello/greet.html", {
        "name": name. Capitalize()
    })

The space between 'greet' and '(request, name)' was responsible for the error

0
问题很简单,括号后面没有多余的逗号。
def home(request):
return render(request,'home.html',{}), //error bcz of  extra comma

之后

def home(request):

return render(request,'home.html',{}) //no  error

1
请不要重复答案。 - ChrisGPT was on strike

-2
这个bug花了我很多时间才找到,而且在这里也找不到答案。只是有些类似的东西,所以我决定把这个具体的问题放在这里:
return render(request, 'templates folder directory', {'team': team}, {'form': form}) 

正确:

return render(request, 'templates folder directory', {'team': team, 'form': form }) 

1
你的回答可以通过提供额外的支持信息来改进。请编辑以添加更多细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到关于如何编写好的回答的更多信息。 - Community
1
你的回答可以通过提供更多的支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接