Django modeltranslation slug问题。当我更改语言时,请不要输入正确的网址

时间:2018-11-12 16:00:28

标签: python django django-modeltranslation

模型翻译...

我在translation.py上更改标题,内容和子句部分。一切正常,但我有问题。

让我尝试解释;

我的网站上有一篇文章,而这篇文章“像虫一样”;

slug_en = some_en_slug

slug_fr = some_fr_slug

我的导航栏上有一个语言转换器。

     {% get_current_language as LANGUAGE_CODE %}
     {% get_available_languages as LANGUAGES %}
     {% get_language_info_list for LANGUAGES as languages %}

<form action="{% url "set_language" %}" method="post" class="navbar-form navbar-right">
{% csrf_token %}
<div class="form-group">
    <select name="language" class="form-control" onchange="this.form.submit()">
    {% for language in languages %}
    <option value="{{ language.code }}"
        {% if language.code == LANGUAGE_CODE %}selected="selected"{% endif %}>
        {{ language.name_local }}
    </option>
    {% endfor %}
    </select>
</div>
</form>

实际上是这个lang。转换器工作正常。这是更改外部帖子中所有Slug href url的内容。。。但这并没有更改帖子页面中的Slug url。

当我访问此网址时;

https://example.com/en/en_slug

,并尝试更改语言后,我的浏览器将使用此url;

https://example.com/fr/en_slug,我看到404页。

更改语言后,我需要转到https://example.com/fr/fr_slug这个网址...

我对此一无所知。我需要您的帮助。

urls.py
from django.urls import path
from . import views
from django.utils.translation import gettext_lazy as _

app_name = "article"


urlpatterns = [
    path(_('dashboard/'),views.dashboard,name="dashboard"),
    path(_('addarticle/'),views.addarticle,name="addarticle"),
    path('<slug>',views.detail,name="detail"),
    path('edit/<int:id>',views.editArticle,name="edit"),
    path('delete/<int:id>',views.deleteArticle,name="delete"),
    path(_('article/'),views.articles,name="article"),
    path('comment/<int:id>',views.addcomment,name="comment"),
    path('category/<slug>', views.category_detail,name="category_detail" )
]

models.py

from django.db import models
from ckeditor.fields import RichTextField
from django.utils.text import slugify

class Article(models.Model):

    author = models.ForeignKey("auth.User",on_delete = models.CASCADE, verbose_name="Author")
    title = models.CharField(max_length = 120, verbose_name="Title")
    category = models.ForeignKey('Category', on_delete = models.CASCADE, null=True, blank=True)
    content = RichTextField(verbose_name="Content")
    created_date = models.DateTimeField(auto_now_add=True, verbose_name="Created Date")
    image = models.ImageField(blank=True, null=True, verbose_name="Add Image (.jpg .png)")
    slug = models.SlugField(unique=True, max_length = 130)

    def __str__(self):
        return self.title

    def get_unique_slug(self):
        slug = slugify(self.title.replace("ı","i"))
        unique_slug = slug
        counter = 1
        while Article.objects.filter(slug=unique_slug).exists():
            unique_slug = '{}-{}'.format(slug, counter)
            counter += 1
        return unique_slug

    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = self.get_unique_slug()
        return super(Article, self).save(*args, **kwargs)

translation.py

from modeltranslation.translator import translator, TranslationOptions
from .models import Article

class ArticleTranslationOptions(TranslationOptions):
    fields = ('title', 'content','slug')

translator.register(Article, ArticleTranslationOptions)

view.py

from django.shortcuts import render,  get_object_or_404
from .models import Article, Category
from django.core.paginator import Paginator
from django.utils.translation import gettext as _

def index(request): 
    from django.utils import translation  
    articles = Article.objects.all()
    category = Category.objects.all()

    context = {
        "articles": articles,
        "category": category,

         }

    return render(request, 'index.html', context)

def detail(request,slug):
    article = get_object_or_404(Article, slug = slug)
    category = Category.objects.all()

    return render(request, "detail.html", {"article":article, "category":category,})



def category_detail(request,slug):
    template = "category_detail.html"

    category=get_object_or_404(Category,slug=slug)
    article=Article.objects.filter(category=category)

    context = {
        'category' : category,
        'article' : article,
    }
    return render(request,template,context)

def category_page(request):
    object_list = Category.objects.all()
    context = {'object_list': object_list,}
    return render(request, 'detail.html', context)

我认为我需要对urls.py进行一些更改,但我不知道:/

感谢帮助...

1 个答案:

答案 0 :(得分:0)

在您的detail视图中,您应该尝试将slug与所有语言匹配:

from django.conf import settings
from django.db.models import Q

languages = dict(settings.LANGUAGES).keys()
q = Q()
for lang in languages:
    kwargs = {'slug_%s' % lang: slug}
    q |= Q(**kwargs)
articles = Article.objects.filter(q)
if articles.exists():
    article = articles.first()
else:
    return Http404

如果要将URL切换为当前语言的正确标记,则可以在article = articles.first()之后添加以下行:

if not article.slug == slug:  
    # slug is a different language than the current one
    return redirect(reverse("detail", kwargs={'slug': article.slug}))

请注意,这将添加往返行程,并第二次重新引用同一篇文章,但我看不到如何更改URL。