Django Локализация: подключение языков и моделей - PullRequest
0 голосов
/ 07 августа 2020

Основная идея моего проекта с локализацией - показывать разный контент на всех языках. Я пытаюсь использовать Django Интернационализацию и локализацию.

Все работало, за исключением одной проблемы:

Если я опубликую вопрос (проект QA) на языке poli sh, мой URL is - site.com/pl/questions/question_123/

И тот же вопрос доступен для всех других языков: испанский sh - site.com/es/questions/question_123/ Норвежский - site.com/no / questions / question_123 /

Можно ли сделать вопрос доступным только на том языке, на котором он был опубликован?

Модели:

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

Просмотры

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

URL-адреса

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

Настройки

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'),
]

Просмотр категории

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

1 Ответ

0 голосов
/ 07 августа 2020

Вы можете переопределить

get_queryset()

из DetailView и элемента управления и отфильтровать свой набор запросов по языку.

return Question.objects.filter(language__code=MY_LANGUAGE_CODE)

Вы можете получить доступ к коду своего языка, вероятно, с помощью поля URL-slug . Это должно быть доступно где-нибудь в вашем обзоре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...