django-modeltranslation:如何禁用没有翻译语言的显示对象例如帖子?

问题描述

我正在开发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)

可能有不同的更有效的方法来实现这一目标。