[英]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.