djangodjango-modeltranslation

django-modeltranslation: how to disable showing objects (e.g. posts) for the languages that it doesn't have translation?


I am developing a django multilingual app and using django-modeltranslation to translate the models. It works fine except one thing: when translation is not available in a specific language, it still shows the objects (let's say posts). I have some posts that are available in tajik while not available in russian, and vice versa.

My goal is to disable showing the posts in the language which I do not have translation. May be by showing 404 or any other way, but it should not show the posts at all, not partially

Here are my settings: 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, blank=True, unique=True, help_text="Введите ссылку публикации. Нап.: eto-publikaciya")
    ShortDesc = models.TextField("Короткое Описание", blank=True, help_text="Введите короткое описание публикации")
    Content = RichTextUploadingField("Полное Описание", blank=True, help_text="Введите контент публикации")
    # author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True) 
    
    avtor = models.ForeignKey(Specialist, on_delete=models.SET_NULL, null=True, 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)],
                                 format='JPEG',
                                #  options={'quality': 60}
                                 )
    VideoEmbedCode = models.TextField("Embed код видео", blank=True, 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')

My 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)

Is there anything I am setting wrong with modeltranslation? How can I disable showing posts that are not available in Russian (or tajik)?


Solution

  • So basically, I have put an if statement, which checks if a field is empty. If so, that it excludes the object.

    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)
    

    Or, more shorter:

    posts = Post.objects.filter(status='published').exclude(ShortDesc__exact=None)
    

    Probably there are different more efficient ways to do that.