簡體   English   中英

Django parler TranslatableSlugMixin 從英文翻譯成另一種語言,但是一旦翻譯不能再翻譯回來返回404

[英]Django parler TranslatableSlugMixin translates from English to another language, but once translated cannot be translated back returns 404

我正在將 Django CMS 與 Django Parler 一起使用,但遇到了一個讓我發瘋的問題,所以如果有人能提供幫助,我將不勝感激!

所以我正在創建一個簡單的博客應用程序,將 slug 作為可翻譯字段。 這是簡化的模型:

from parler.models import TranslatableModel, TranslatedFields

class Article(TranslatableModel):
    ...
    translations = TranslatedFields(
        ...
        slug = models.SlugField(_('slug'), max_length=255, blank=True, allow_unicode=True),
        meta = {'unique_together': (('language_code', 'slug'),)}
    )

    ...

    def get_absolute_url(self):
        return reverse('blog:article_detail', kwargs={'slug': self.slug})

以下是網址:

from django.conf.urls import include, url

from .views import ArticleDetailView

urlpatterns = [
    ...
    url(r'^(?P<slug>\w[-\w]*)/$', ArticleDetailView.as_view(), name='article_detail'),
]

最后是視圖:

from django.views.generic import DetailView
from parler.views import TranslatableSlugMixin

from .models import Article

class ArticleDetailView(TranslatableSlugMixin, DetailView):
    model = Article
    template_name = 'blog/_article.html'

我用英語、法語和德語創建了一篇文章,每種語言都有不同的 slug,我們稱之為:

/en/blog/english-slug
/fr/blog/french-slug
/de/blog/german-slug

我可以正確導航到所有這些,但是在 Django CMS 中,您在英語頁面的頂部有語言菜單,鏈接顯示為:

/en/blog/english-slug
/fr/blog/english-slug
/de/blog/english-slug

這很好,因為這就是視圖中的 TranslatableSlugMixin 處理的內容(參見http://django-parler.readthedocs.io/en/latest/api/parler.views.html )。

因此,當我單擊其中一個鏈接(比如法語鏈接)時,視圖會正確找到正確的文章並將我重定向到正確的 url。 所以點擊:

/fr/blog/english-slug

已正確地將我帶到:

/fr/blog/french-slug

但這就是一切都出錯的地方。 我現在想導航回英文頁面,顯示為:

/en/blog/french-slug

但是,當我單擊該鏈接時,它會導航到 404。如果我從法語 URL 導航到德語 URL,則情況相同。 但是,如果我立即從英語轉到德語,它會起作用。

抱歉,我知道這很難解釋,但似乎翻譯從基本/默認到其他語言的一種方式工作,但在語言之間交換或返回基本/默認時無法正常工作。

肯定 TranslatableSlugMixin 旨在允許這種情況發生?! 所以我在這里錯過了什么嗎?

任何幫助將非常感激。 如有必要,很樂意提供更多信息。

謝謝

好的,所以我已經想出了如何使這項工作,結果它是一個組合的事情......

  1. 使用默認的 Django CMS 選擇器是一個錯誤:

     {% language_chooser "menu/language_chooser.html" %}

    這導致了我上面描述的 URL:

     /en/blog/english-slug /fr/blog/english-slug /de/blog/english-slug

    閱讀 Django Parler 文檔讓我使用了他們的語言導航菜單:

     {% for lang_code, title in LANGUAGES %} {% get_language_info for lang_code as lang %} {% get_translated_url lang_code as tr_url %} {% if tr_url %}<li{% if lang_code == LANGUAGE_CODE %} class="is-selected"{% endif %}><a href="{{ tr_url }}" hreflang="{{ lang_code }}">{{ lang.name_local|capfirst }}</a></li>{% endif %} {% endfor %}

    這導致網址指向正確的位置:

     /en/blog/english-slug /fr/blog/french-slug /de/blog/german-slug
  2. 為了使 Django Parler 導航正常工作,我需要更新模型中的 get_absolute_url() 以處理不同的語言。 我是這樣做的:

     from django.utils.translation import get_language from parler.models import TranslatableModel, TranslatedFields class Article(TranslatableModel): ... def get_absolute_url(self): language = get_language() if self.has_translation(language): slug = self.safe_translation_getter('slug', language_code=language) return reverse('blog:article_detail', kwargs={'slug': slug}) # no translation so fallback to all article list return reverse('blog:article_list')

呼! 那真是頭疼! 希望這可以幫助其他人在未來!

PS 在我的研究過程中,我遇到了這個看起來非常棒的博客應用程序:

https://github.com/nephila/djangocms-blog

它幫助我徹底解決了這個噩夢!

更新

查看 djangocms-blog(上面的鏈接)中的 get_absolute_url(),他們有一個更好的解決方案。 他們的實現是:

from django.utils.translation import get_language

from parler.models import TranslatableModel, TranslatedFields

class Article(TranslatableModel):

    ...

    def get_absolute_url(self, lang=None):
        if not lang or lang not in self.get_available_languages():
            lang = self.get_current_language()
        if not lang or lang not in self.get_available_languages():
            lang = get_language()
        with switch_language(self, lang):
            slug = self.safe_translation_getter('slug', language_code=lang, any_language=True)
            return reverse('blog:article_detail', kwargs={'slug': slug})

謝謝 nephila,這讓我免於許多詛咒和沮喪:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM