问题描述
我正在开发django多语言应用程序,并使用django-modeltranslation来翻译模型。它可以正常工作,但有以下几点:当无法提供特定语言的翻译时,它仍会显示对象(比如说帖子)。我有一些可用塔吉克语发布的帖子,而没有俄语版,反之亦然。
我的目标是禁止以我没有翻译的语言显示帖子。可以通过显示404或任何其他方式来显示,但它根本不应该全部显示帖子,而不是部分
这是我的设置: settings.py
LANGUAGES = [
('ru',_('Russian')),('tg',_('Tajik')),# ('en',_('English')),]
EXTRA_LANG_INFO = {
'tg': {
'bidi': False,'code': 'tg','name': 'Tajik','name_local': u'Тоҷикӣ',},}
# Add custom languages not provided by Django
LANG_INFO = dict(list(django.conf.locale.LANG_INFO.items()) + list(EXTRA_LANG_INFO.items()))
django.conf.locale.LANG_INFO = LANG_INFO
global_settings.LANGUAGES = global_settings.LANGUAGES + [("tg",'Tajik')]
LANGUAGE_CODE = 'ru'
# from modeltranslation.settings import ENABLE_REGISTRATIONS
MODELTRANSLATION_LANGUAGES = ('tg','ru')
MODELTRANSLATION_DEFAULT_LANGUAGE = ('tg')
MODELTRANSLATION_FALLBACK_LANGUAGES = ('ru','tg')
transation.py
from modeltranslation.translator import translator,Translationoptions
from blog.models import Post,Matlab
class BlogPostTranslationoptions(Translationoptions):
fields = ('Title','ShortDesc','Content')
translator.register(Post,BlogPostTranslationoptions)
models.py:
class Post(models.Model):
STATUS_CHOICES = (
('draft','Черновик'),('published','Опубликованно'),)
POST_TYPE_CHOICES = (
('image','Image'),('video','Video'),)
Title = models.CharField("Заголовок публикации",blank=True,max_length=250,help_text="Введите заголовок публикации")
Slug = models.SlugField(max_length=250,unique=True,help_text="Введите ссылку публикации. Нап.: eto-publikaciya")
ShortDesc = models.TextField("Короткое Описание",help_text="Введите короткое описание публикации")
Content = RichTextUploadingField("Полное Описание",help_text="Введите контент публикации")
# author = models.ForeignKey(User,on_delete=models.SET_NULL,null=True,blank=True)
avtor = models.ForeignKey(Specialist,default=None,blank=True)
posttype = models.CharField(max_length=10,choices=POST_TYPE_CHOICES,default='image')
Image = ProcessedImageField(upload_to='blog/%Y/%m/%d/',processors=[ResizetoFill(1200,768)],format='JPEG',options={'quality': 60},blank=False)
image_thumbnail = ImageSpecField(source='Image',processors=[ResizetoFill(768,500)],# options={'quality': 60}
)
VideoEmbedCode = models.TextField("Embed код видео",help_text="Введите Embed код публикации")
# published = models.DateTimeField(auto_Now=True)
tags = TaggableManager(through=TaggedPost,blank=True)
allow_commenting = models.BooleanField("Разрешить комментирование",default=True)
hide_comments = models.BooleanField("Скрыть комментариев",default=False)
Created = models.DateTimeField(auto_Now_add=True)
Updated = models.DateTimeField(auto_Now=True)
status = models.CharField(max_length=10,choices=STATUS_CHOICES,default='published')
我的 views.py :
def blog_list(request):
template = 'blog/blog_index.html'
posts = Post.objects.filter(status='published')
common_tags = Post.tags.most_common()[:4]
recent_posts = Post.objects.filter(status='published').order_by("-Created")[:3]
#Paginator
paginator = Paginator(posts,3) # Show n posts per page
page = request.GET.get('page')
posts = paginator.get_page(page)
# allTags = Tag.objects.all() #All tags
allBlogTags = Post.tags.all() #[:2]
# categories = Category.objects.all()
args = {
'posts': posts,'common_tags':common_tags,'recent_posts': recent_posts,'allBlogTags':allBlogTags,}
return render(request,template,args)
我是否对模型翻译设置有误? 如何禁用显示俄语(或塔吉克语)不可用的帖子?
解决方法
因此,基本上,我放置了if语句,该语句检查字段是否为空。如果是这样,它将排除该对象。
def blog_list(request):
# translation.activate('tg')
template = 'blog/blog_index.html'
posts = Post.objects.filter(status='published')
if request.LANGUAGE_CODE == 'ru':
posts = posts.exclude(ShortDesc_ru__exact='')
elif request.LANGUAGE_CODE == 'tg':
posts = posts.exclude(ShortDesc_tg__exact='')
common_tags = Post.tags.most_common()[:4]
recent_posts = Post.objects.filter(status='published').order_by("-Created")[:3]
#Paginator
paginator = Paginator(posts,6) # Show n posts per page
page = request.GET.get('page')
posts = paginator.get_page(page)
# allTags = Tag.objects.all() #All tags
allBlogTags = Post.tags.all() #[:2]
# categories = Category.objects.all()
args = {
'posts': posts,'common_tags':common_tags,'recent_posts': recent_posts,'allBlogTags':allBlogTags,}
return render(request,template,args)
或更短:
posts = Post.objects.filter(status='published').exclude(ShortDesc__exact=None)
可能有不同的更有效的方法来实现这一目标。