7

現在、複数の言語をサポートしている Django アプリがあります。サブドメインのサポートを追加して、「de.mysite.com」にアクセスするとドイツ語の記事を照会し、「mysite.com」では英語 (デフォルト言語) で記事を照会できるようにしたいと考えています。約 20 のサブドメインがすべて同じ Django アプリを指しています。

データのすべてのフィールドを含む抽象モデルと、各言語の派生モデルがあります。各言語には、次のように独自のデータベース テーブルがあります。

class ArticleBase(models.Model):
    title = models.CharField(max_length=240, unique=True)
    date_added = models.DateField(auto_now_add=True)

    class Meta:
        abstract = True

# This is English, the default.
class Article(ArticleBase):
    pass

class Article_de(ArticleBase):
    pass

次のような記事を入手できます(今日はこれが機能しています):

def article(request, title, language=None):
    if language:
        mod = get_model('app', 'Article_' + language)
        items = mod.filter(title=title)
    else:
        items = Article.objects.filter(title=title)

これは私の現在の URL パターンです。

url(r'^article/(?P<title>[a-zA-Z_-]+)/$", 'app.views.article', name='article'),

記事ビューに渡すことができるように、URL パターンのサブドメイン プレフィックスを解析するにはどうすればよいですか? または、ビューを処理しているときにリクエストからこの情報を取得する必要がありますか?

4

3 に答える 3

10

django の URL は URL のドメイン セクションにアクセスできないため、これはオプションではありません。各ビューで手動で行うことは可能ですが、維持するのはそれほど簡単ではありません。

ミドルウェアでリクエストヘッダーをチェックしてから適切な言語をロードするカスタムミドルウェアソリューションの方がおそらく優れていると思います(または、accept-languageヘッダーを置き換えてdjangoに魔法をかけさせます)

localmiddlewareは、必要に応じてモデル/クエリに渡すために簡単に使用できる言語を利用できるようにすることができます

また、私が尋ねるかもしれませんが、なぜすべてのエントリを別々のテーブル/モデルに保存するのですか? モデルに言語フィールドを追加して、すべてを 1 つのテーブルに格納することはできませんか? 記事に 20 ほどのモデルを使用すると、1 つのモデルよりも保守が難しくなる可能性があるためです。

アップデート:

私は少し遊んでみましたが、必要なミドルウェアは非常に単純です (ただし、私のテストはかなり制限されていました)。

class SubDomainLanguage(object):
    def process_request(self, request):
        try:
            request.session['django_language'] = request.META['HTTP_HOST'].split('.')[0]
        except KeyError:
            pass

はミドルウェアであり、次を含むように設定を変更します。

MIDDLEWARE_CLASSES = (
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    'subdomainmiddleware.SubDomainLanguage',
    'django.middleware.locale.LocaleMiddleware',
    ...
)

このようにして、通常の Django 組み込みの i18n サポートを活用できます。

ビューでは、言語を使用できますrequest.LANGUAGE_CODE

于 2013-10-15T15:47:29.067 に答える