在django中,我希望允许表单?...&lang=&...的查询字符串设置当前的url。理想情况下,将从查询字符串中删除lang=,并将会话语言键设置为新语言。
最终产生的url将是浏览器登陆的url。除了i18n提供的其他语言选择方法(因此我猜这将是一个中间件),站点上的每个url都会出现这种情况。
我非常不喜欢POST视图方法,这似乎是django-i18n的标准。
像这样的东西已经存在了吗?
发布于 2017-04-10 12:04:08
在阅读了Django文档之后,意识到Django开发人员似乎也在执行自己的编码标准(在这里,我特别想到源代码中的这个注释:
Since this view changes how the user will see the rest of the site, it must
only be accessed as a POST request. If called as a GET request, it will
redirect to the page in the request (the 'next' parameter) without changing
any state.)我决定使用概述的解决方案在这个岗位上,我在下面(几乎)逐字粘贴该解决方案(因此是非语义表布局):
<div id="languages">
<table >
<tr>
{% get_available_languages as languages %}
{% for key, item in languages %}
<td>
<form action="/i18n/setlang/" method="post">
{% csrf_token %}
<input type="hidden" name="language" value="{{key}}"/>
<input id="lang_select_{{key}}" type = "image" src="/media/img/{{ key }}.gif" alt="{{ item }}"/>
</form>
</td>
{% endfor %}
</tr>
</table>
</div>我还想出了我自己的JS解决方案,它更灵活,也更复杂,所以它并不值得(尽管它提供链接:但是由于它们需要onClick属性或道义上的等价物,它们对于SEO的目的是无用的)。
当然,抛出代码并删除dumbass GET限制也是一种选择--尽管维护性更高。
P.S:那些认为我的评论带有对抗性的人(毫无疑问,我的追求也被误导了)应该考虑一下,要求POST转换语言的立场是如何面对SE遍历的,同时强制跳过这种循环,以遵守允许用户通过点击标志图标来切换语言的既定设计惯例。
发布于 2019-11-09 23:41:29
Django中间件语言更改查询字符串?hl=langcode
https://gist.github.com/teury/5d2213181ed0abe06c316c19431f355e
import django
from django.utils import translation
from django.shortcuts import redirect, reverse
def is_django_greater_than_1_10():
main_version = django.VERSION[0]
if main_version > 1:
return True
sub_version = django.VERSION[1]
if main_version == 1 and sub_version >= 10:
return True
return False
if is_django_greater_than_1_10():
from django.utils.deprecation import MiddlewareMixin
superclass = MiddlewareMixin
else:
superclass = object
class LanguageMiddleware(superclass):
def process_response(self, request, response):
if request.resolver_match.view_name is "home":
lang_url = request.GET.get('hl')
if not lang_url:
return response
current_language = translation.get_language()
if lang_url == current_language:
return response
translation.activate(lang_url)
request.session[translation.LANGUAGE_SESSION_KEY] = lang_url
return redirect(reverse('home') + '?hl=' + lang_url)
else:
return response我在一个“家庭”网址上实现了这个系统。
根据键值更改语言
谷歌提供的。Idioma =Espa ol
https://stackoverflow.com/questions/43261173
复制相似问题