Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django多语言模型/按语言筛选帖子_Django - Fatal编程技术网

Django多语言模型/按语言筛选帖子

Django多语言模型/按语言筛选帖子,django,Django,这是我简单的博客模式 class Article(models.Model): author = models.ForeignKey("auth.User",on_delete = models.CASCADE, verbose_name="Author") title_en = models.CharField(max_length = 120, verbose_name="Title_En") title_de = models.CharField(max_leng

这是我简单的博客模式

class Article(models.Model):

    author = models.ForeignKey("auth.User",on_delete = models.CASCADE, verbose_name="Author")
    title_en = models.CharField(max_length = 120, verbose_name="Title_En")
    title_de = models.CharField(max_length = 120, verbose_name="Title_De")
    category = models.ForeignKey('Category', on_delete = models.CASCADE, null=True, blank=True)
    content_en = RichTextField(verbose_name="Content_En")
    content_de = RichTextField(verbose_name="Content_De")
    created_date = models.DateTimeField(auto_now_add=True, verbose_name="Created Date")
    image = models.ImageField(blank=True, null=True, verbose_name="Add Photo (.jpg .png)")
    slug = models.SlugField(unique=True, max_length = 130)

    def __str__(self):
        return self.title
我用url的语言像这样

domainname.com/en/ domainname.com/de/

例如,如何在domainname.com/de URL中仅显示属于title_de和content_de的内容

如何使用语言进行过滤?有没有简单的解决办法? (我使用django 2.1.2。我尝试django modeltranslation,否则其他人无法使用此django版本…)


谢谢…

基于键向参数的过滤是解决此问题的选项之一。我更喜欢添加一个语言字段'EN'或'DE',而不是重复相同类型的标题和内容字段并基于此进行过滤。比如说,

文章模型可以是这样的 我们的URL可以是 您可以创建一个包装已翻译字段的

from django.utils import translation

class TranslatedField:
    def __init__(self, field_name):
         self.partial_field_name = field_name

    def __get__(self, obj, objtype):
        return getattr(obj, self.field_name)

    def __set__(self, obj, value):
        return setattr(obj, self.field_name,  value)

    @property
    def field_name(self):
        language_code = translation.get_language()
        rerurn self.partial_field_name + '_' + language_code

class Article(models.Model):

    title_en = models.CharField(max_length=120)
    title_de = models.CharField(max_length=120)
    title = Translated Field('title')
那你就可以了

article = Article.objects.create(
    title_en='In english',
    title_de='In German'
)

print(article.title)  # 'In english'
translation.set_language('de')
print(article.title)  # 'In German'
article.title = 'In German!'
print(article.title)  # 'In German!'
translation.set_language('en')
print(article.title)  # 'In english'
(未经测试,因此可能存在打字错误)


我会用一些开箱即用的东西,比如

非常感谢你的帮助。我马上去做。非常感谢你。你是最棒的!
from rest_framework import views, status
from .serializers import ArticleSerializer
from .models import Article

class ArticleView(views.APIView):

    def get(self, request):
        article_language_type = self.kwargs.get('type', None)
        articles = Article.objects.filter(language=article_language_type)
        serializer = ArticleSerializer(articles, many=True)
        if serializer.is_valid():
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
              return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
from django.utils import translation

class TranslatedField:
    def __init__(self, field_name):
         self.partial_field_name = field_name

    def __get__(self, obj, objtype):
        return getattr(obj, self.field_name)

    def __set__(self, obj, value):
        return setattr(obj, self.field_name,  value)

    @property
    def field_name(self):
        language_code = translation.get_language()
        rerurn self.partial_field_name + '_' + language_code

class Article(models.Model):

    title_en = models.CharField(max_length=120)
    title_de = models.CharField(max_length=120)
    title = Translated Field('title')
article = Article.objects.create(
    title_en='In english',
    title_de='In German'
)

print(article.title)  # 'In english'
translation.set_language('de')
print(article.title)  # 'In German'
article.title = 'In German!'
print(article.title)  # 'In German!'
translation.set_language('en')
print(article.title)  # 'In english'