简体   繁体   English

Django 本地化:语言和模型连接

[英]Django Localization: languages and models connection

The main idea of my project with localisation is show different content on all languages.我的本地化项目的主要思想是在所有语言上显示不同的内容。 I'm trying to use Django Internationalization and localization.我正在尝试使用 Django 国际化和本地化。

Everything worked, except for one problem:一切正常,除了一个问题:

If I post question (QA project) on polish language, my url is - site.com/pl/questions/question_123/如果我发布关于波兰语的问题(QA 项目),我的 url 是 -site.com/pl/questions/question_123/

And same question is available on all others locales: Spanish - site.com/es/questions/question_123/ Norwegian - site.com/no/questions/question_123/同样的问题适用于所有其他语言环境:西班牙语 - site.com/es/questions/question_123/ 挪威语 - site.com/no/questions/question_123/

Is it possible to make question available only in the language in which it was posted?是否可以仅以发布问题的语言提供问题?

Models:楷模:

class Language(models.Model):
    name = models.CharField(max_length=100, unique=True)
    code = models.CharField(max_length=20, unique=True)

    def __str__(self):
        return f'{self.name} ({self.code})'


class Question(models.Model):
    """Main class for all questions"""

    is_active = models.BooleanField(default=False)
    language = models.ForeignKey(Language, on_delete=models.CASCADE, null=True)
    title = models.CharField(max_length=500)
    slug = models.SlugField(max_length=600, unique=True, blank=True)
    body = models.TextField(max_length=1000, blank=True)
    category = models.ForeignKey(
        Category,
        on_delete=models.CASCADE,
        related_name='question_category'
    )
    tags = models.ManyToManyField(Tag, related_name='question_tags', blank=True)
    date_published = models.DateTimeField(auto_now_add=True)
    date_edited = models.DateTimeField(auto_now=True)
    vote = models.ManyToManyField(
        Profile, blank=True, related_name='question_vote'
    )
    user = models.ForeignKey(
        Profile, on_delete=models.CASCADE, blank=True, null=True
    )

    class Meta:
        verbose_name = 'question'
        verbose_name_plural = 'questions'

    def get_absolute_url(self):
        return reverse('questions:detail', kwargs={'slug': self.slug})

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = generate_slug(self.title)
        super().save(*args, **kwargs)

    @property
    def num_votes(self):
        return self.vote.all().count()

    def __str__(self):
        return self.title

Views意见

class QuestionDetailView(DetailView):
    model = Question

    def get_context_data(self, **kwargs):
        context = super(QuestionDetailView, self).get_context_data(**kwargs)
        context['tags'] = Tag.objects.filter(question_tags=self.object)
        context['answers'] = Answer.objects.filter(question=self.object)
        context['current_site'] = get_current_site
        return context

Urls网址

urlpatterns = [
    path('view/<slug:slug>/', QuestionDetailView.as_view(), name='detail')
]

Settings设置

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.contrib.redirects.middleware.RedirectFallbackMiddleware',
]


LANGUAGE_CODE = 'en'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

LOCALE_PATHS = [
    os.path.join(BASE_DIR, 'locale')
]

LANGUAGES = [
    ('en', 'English'),
    ('es', 'Spanish'),
    ('pl', 'Polish'),
]

Category View类别视图

from django.utils.translation import get_language

class CategoryListView(ListView):
    template_name = 'categorizations/category_list.html'

    def get_queryset(self):
        current_language = get_language()
        self.category = get_object_or_404(Category, slug=self.kwargs['slug'])
        return Question.objects.filter(
            category=self.category, language__code=current_language
        )

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        current_language = get_language()
        context['questions'] = Question.objects.filter(
            category=self.category, is_active=True, language__code=current_language)
        context['current_object'] = Category.objects.filter(
            name=self.category)
        return context

You can override您可以覆盖

get_queryset()

from the DetailView and control, and filter your queryset by language.从 DetailView 和控件中,并按语言过滤您的查询集。

return Question.objects.filter(language__code=MY_LANGUAGE_CODE)

You can access your language code probably with your URL-slug field.您可以使用您的 URL-slug 字段访问您的语言代码。 This should be accessible somewhere in your View.这应该可以在您的视图中的某处访问。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM