Django刷新当前页面时不会更新请求对象

2 投票
1 回答
865 浏览
提问于 2025-04-15 23:20

我有一个Django网站,想让它支持多种语言。直到今天早上,一切都运作得很好。事情是这样的:我打开“关于我们”页面,看到的是英文。下面有一个切换语言的按钮,按下去后,所有内容“神奇地”变成了保加利亚语,正是我想要的。不过,我还有一个JavaScript菜单,用户可以通过它浏览产品。我点击了“T恤”,然后下面会弹出一个子菜单,里面有不同的分类——男士、女士、儿童。这个链接会带我到一个页面,列出我想要的衣服。但是……当我试图在这个时候切换语言时,什么都没有发生。我回到“关于我们”页面,从那里切换语言,再返回衣服目录,语言就变了……

我接下来会贴一些代码。

这是我的切换按钮代码:

function changeLanguage() {
    if (getCookie('language') == 'EN') {
        setCookie("language", 'BG');
    } else {
        setCookie("language", 'EN');
    }
    window.location.reload();
}

我的“关于我们”页面:

@base
def aboutUs(request):
    return """<b>%s</b>""" % getTranslation("About Us Text", request.COOKIES['language'])

还有@base方法:

def base(myfunc):
    def inner_func(*args, **kwargs):
        try:
            args[0].COOKIES['language'] 
        except:
            args[0].COOKIES['language'] = 'BG'

        # raise Exception(request)

        # if I am in the AboutUs page 
        # and I click on the language change button
        # the cookie value in the request object changes
        # if however I am in the displayClothes page
        # the value stays the same

        # some code I removed

        contents = myfunc(*args, **kwargs)

        return render_to_response('index.html', {'title': title, 'categoriesByCollection': categoriesByCollection.iteritems(), 'keys': enumerate(keys), 'values': enumerate(values), 'contents': contents, 'btnHome':getTranslation("Home Button", args[0].COOKIES['language']), 'btnProducts':getTranslation("Products Button", args[0].COOKIES['language']), 'btnOrders':getTranslation("Orders Button", args[0].COOKIES['language']), 'btnAboutUs':getTranslation("About Us Button", args[0].COOKIES['language']), 'btnContacts':getTranslation("Contact Us Button", args[0].COOKIES['language']), 'btnChangeLanguage':getTranslation("Button Change Language", args[0].COOKIES['language'])})
    return inner_func

以及目录页面:

@base
def displayClothes(request, category, collection, page):
    clothesToDisplay = getClothesFromCollectionAndCategory(request, category, collection)

    contents = ""

    # some code I removed        

    return """%s""" % (contents)

让我解释一下,你不需要对我发布的大量代码感到惊慌。你不必理解它,甚至不需要看完所有的代码。我发布这些只是为了以防万一,因为我真的搞不清楚这个bug的来源。

现在,我已经缩小了问题的范围。我在每次想知道请求对象里面有什么时,都会用“raise Exception(request)”来调试。当我把这个放在我的aboutUs方法里时,每次按下语言按钮,语言的cookie值都会改变。但在displayClothes方法里就不一样了,语言保持不变。我还尝试把异常行放在@base方法的开头,结果发现情况也是一样的。当我在“关于我们”页面点击按钮时,请求对象里的语言会改变,但在目录页面按下按钮时,它却保持不变。

这就是我能找到的全部信息,我不知道Django是如何区分我的页面的,也不知道具体是怎样的。

附言:我觉得JavaScript运行得很好,我已经用多种方式测试过了。

谢谢你们,希望你们能读完这篇长长的帖子,如果需要更多代码片段,请随时问我。

1 个回答

1

这段代码太多了,读起来很费劲。你真的需要努力把它简化一下。

如果你确定错误出现在displayClothes里,那你可以逐步注释掉一些代码,直到不再出现错误为止。不过在这段代码里似乎没有什么会改变这个视图中的cookies,所以我不太确定这样做能否成功。另外,确保你检查的是请求中实际包含的内容,而不是你认为的内容。

顺便提一下:你把HTML直接写进视图里了。我觉得你可能不想这样做——Django有模板的原因就是为了避免这种情况。

撰写回答