Джанго, модель перевода, проблема слизняков. Когда я меняю язык, не идите направо
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>
На самом деле это язык. чейнджер работает нормально. Это изменение всех URL-адресов слагов на внешнем посте... Но это не изменило URL-адрес слагов на странице поста.
когда я иду этот URL;
https://example.com/en/en_slug
и после попытки изменить язык, мой браузер собирается этот URL;
https://example.com/fr/en_slug и я вижу страницу 404..
мне нужно перейти на https://example.com/fr/fr_slug этот URL после смены языка...
Я не имею ни малейшего представления об этом. Я хотел бы вашей помощи.
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 ответ
В вашем 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.