0

自分のWebサイトをアクセント付きの文字(フランス語のWebサイト)と互換性を持たせるのに問題があります。

一部のフィールド値にアクセント付きの文字を含めることができるフォームがあります。たとえば、「Coupé」です。

私のURLは次のようになります:

http://localhost:8080/recherches/s?marque=Audi&modeles=A5+Coup%C3%A9

私のdjangoビューでは、次のようなことをします。

def search(request):
  logger = logging.getLogger('custom')
  criteria_form = CriteriaForm(request.GET or None)
  logger.debug("search")
  logger.debug(request.GET)

そして、ログに記録されるのは次のとおりです。

<QueryDict: {u'marque': [u'Audi'], u'modeles': [u'A5 Coup\xc3\xa9']}>

この変数「modeles」を使用してデータベースにクエリを実行すると、エラーが発生します。

>>> mo = u'A5 Coup\xc3\xa9'
>>> Vehicule.objects.filter(valid=True, modele=mo)[0].marque.name
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/django/db/models/query.py", line 211, in __getitem__
    return list(qs)[0]
IndexError: list index out of range

utf-8バージョンでデータベースをクエリすると、問題は解決します。

>>> mo = 'A5 Coup\xc3\xa9'
>>> Vehicule.objects.filter(valid=True, modele=mo)[0].marque.name
u'Audi'

したがって、私の問題は、変数がutf8であり、Unicodeでエンコードされているという事実に起因していると思います(ただし、間違っている可能性があります)。

どうしてこれがそのようにエンコードされるのですか?

最初の応答後の更新:

フォームを送信するページのヘッダーには、次のものがあります。

<meta http-equiv="Content-type" content="text/html;charset=UTF-8"/>

ただし、views.pyにエンコードを印刷すると、次のようになります。

logger.debug(request.encoding)

次に、Noneを取得します。

しかし、このエンコーディングを設定する方法がわかりません。上記のようにヘッダーからだと思いました...

また、HTTP_ACCEPT_CHARSETにそれがあります。

HTTP_ACCEPT_CHARSET ISO-8859-1,utf-8;q=0.7,*;q=0.3

それはここから来ることができますか?はいの場合、どのように変更すればよいですか?

4

2 に答える 2

0

私はついに問題を見つけました。この問題を、ほとんど何も含まれていない新しいdjangoアプリケーションでテストしました。DBなし、フォームのコンテンツをページに表示する単純なビュー。このようなもの:

# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from django.template import RequestContext


def test(request):
  found = request.GET.get('modeles')
  print found
  return render_to_response('test.html',
                            {"found":found},
                            context_instance=RequestContext(request))

そして、私がURLを開いた場合

localhost:8080/mysite?modeles=Coupé

間違った形式のクーペを入手していました

ここでは確かに、ajax、db呼び出し、またはpythonで実行できたすべてのことを非難することはできませんでした。

だから私はDjango1.4で試してみました...そしてそれは魅力のように機能しました!次に、最新のDjango 1.5a1バージョンを試してみましたが、それも機能しました...

今のところベータ版を使うべきではないと思います。1.4を使い続けます!

これが他の誰かの時間を節約することを願っています。

于 2012-10-30T07:26:25.267 に答える
0

すべての検証マジックがバックグラウンドで発生しているため、すべてをバイパスすることで問題を特定する方が簡単な場合があります。あなたの見解では、次は何を生み出しますか?

Vehicule.objects.filter(valid=True, modele=request.GET['mo'])[0].marque.name

クエリを渡すだけの場合、値を取り戻す前に、巨大なAjaxariffic検証セットがUnicodeに対して奇妙なPython処理を実行し、特殊文字を最後から削除する可能性があります。

編集:これを自分で遊んだ後、GET内のURL化されたデータが問題のようです。それとstring.encode('iso8859-1')。decode('utf8')を実行する代わりに、フォームを変更してPOSTデータを送信して使用する方が簡単です。

于 2012-10-29T21:01:03.440 に答える