Django 不翻译过滤器标签
Django does not translate filter labels
我在我的网站上使用 django-filters 进行过滤,除两个页面外,每个页面上的过滤器标签都被正确翻译。我已经检查了所有常见问题,例如确保将 il8n 加载到两个页面、测试语言环境文件夹的路径、重新启动服务器、检查中间件和其他设置、检查翻译文件中的模糊标签等。我能做到的唯一相似之处他们之间的想法是,当网站上其他页面的 none 时,他们都使用 Django 的内置分页器。这足以破坏翻译吗?我包含了两个页面之一的代码,希望有人能告诉我发生了什么。如果有人想查看代码的其他部分,github 是 here
models_FSJUser.py
class FSJUser(models.Model):
# List the languages a user may choose from in human readable format and also make them accessible in other files
# via FSJUser.LANG_CHOICES, FSJUser.ENGLISH, etc.
FRENCH = 'fr'
ENGLISH = 'en'
LANG_CHOICES = (
(FRENCH, "Fran"+u"\u00E7"+"ais"),
(ENGLISH, 'English'),
)
# Link FSJUser with a User model for authentication related business
user = models.OneToOneField(User, on_delete = models.CASCADE, blank = True, null = True)
# All FSJ Users have these attributes in common
ccid = models.CharField(max_length = 255, unique = True, verbose_name = _("CCID"))
first_name = models.CharField(max_length = 255, verbose_name = _("First Name"))
last_name = models.CharField(max_length = 255, verbose_name = _("Last Name"))
email = models.EmailField(max_length = 254, verbose_name= _("Email"))
lang_pref = models.CharField(max_length = 2, blank = False, choices = LANG_CHOICES, default = FRENCH, verbose_name = _("Language Preference"))
models_student.py
# This class inherits from a standard FSJ User and extends for Student specific attributes and methods
class Student(FSJUser):
program = models.ForeignKey(Program, on_delete = models.SET_NULL, null = True, blank = True, verbose_name = _("Program"))
year = models.ForeignKey(YearOfStudy, on_delete=models.PROTECT, verbose_name = _("Year"))
gpa = models.CharField(max_length = 10, null = True, blank = True, verbose_name = _("GPA"))
middle_name = models.CharField(max_length = 50, blank = True, verbose_name = _("Middle Name"))
student_id = models.CharField(max_length = 10, unique = True, verbose_name = _("U of A Student ID"), validators=[validate_student_id])
filters.py
from .models import *
import django_filters
from django.forms import CheckboxSelectMultiple, DateInput
from django.utils.translation import gettext_lazy as _
LOOKUP_TYPES = [
('icontains', _("contains"))
]
class StudentFilter(django_filters.FilterSet):
ccid = django_filters.CharFilter(lookup_expr='icontains')
first_name = django_filters.CharFilter(lookup_expr='icontains')
middle_name = django_filters.CharFilter(lookup_expr='icontains')
last_name = django_filters.CharFilter(lookup_expr='icontains')
student_id = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Student
fields = ['ccid','first_name','middle_name','last_name','student_id','year','program']
views.py
def coordinator_students(request):
FSJ_user = get_FSJ_user(request.user.username)
student_list = Student.objects.all().order_by('ccid')
filtered_list = StudentFilter(request.GET, queryset=student_list)
student_paginator = Paginator(filtered_list.qs, 25)
template = loader.get_template("FSJ/coord_student_list.html")
context = get_standard_context(FSJ_user)
context["student_list"] = student_list
page = request.GET.get('page', 1)
try:
students = student_paginator.page(page)
except PageNotAnInteger:
students = student_paginator.page(1)
except EmptyPage:
students = student_paginator.page(student_paginator.num_pages)
context["filter"] = filtered_list
context["students"] = students
return HttpResponse(template.render(context, request))
我已经解决了这个问题,但我会post这里的答案以防其他人遇到同样的问题。
我没有弄清楚问题的根源(虽然我现在怀疑是因为我定义了自定义过滤器而不是让它们自动生成);然而,我发现最有效的解决方案是在过滤器的 init 函数中分别为每个过滤器定义标签,如下所示:
def __init__(self, *args, **kwargs):
super(StudentFilter, self).__init__(*args, **kwargs)
# Adding custom translatable labels to autogenerated filters
self.filters['year'].label = _("Year:")
希望这对某人有所帮助。
我在我的网站上使用 django-filters 进行过滤,除两个页面外,每个页面上的过滤器标签都被正确翻译。我已经检查了所有常见问题,例如确保将 il8n 加载到两个页面、测试语言环境文件夹的路径、重新启动服务器、检查中间件和其他设置、检查翻译文件中的模糊标签等。我能做到的唯一相似之处他们之间的想法是,当网站上其他页面的 none 时,他们都使用 Django 的内置分页器。这足以破坏翻译吗?我包含了两个页面之一的代码,希望有人能告诉我发生了什么。如果有人想查看代码的其他部分,github 是 here
models_FSJUser.py
class FSJUser(models.Model):
# List the languages a user may choose from in human readable format and also make them accessible in other files
# via FSJUser.LANG_CHOICES, FSJUser.ENGLISH, etc.
FRENCH = 'fr'
ENGLISH = 'en'
LANG_CHOICES = (
(FRENCH, "Fran"+u"\u00E7"+"ais"),
(ENGLISH, 'English'),
)
# Link FSJUser with a User model for authentication related business
user = models.OneToOneField(User, on_delete = models.CASCADE, blank = True, null = True)
# All FSJ Users have these attributes in common
ccid = models.CharField(max_length = 255, unique = True, verbose_name = _("CCID"))
first_name = models.CharField(max_length = 255, verbose_name = _("First Name"))
last_name = models.CharField(max_length = 255, verbose_name = _("Last Name"))
email = models.EmailField(max_length = 254, verbose_name= _("Email"))
lang_pref = models.CharField(max_length = 2, blank = False, choices = LANG_CHOICES, default = FRENCH, verbose_name = _("Language Preference"))
models_student.py
# This class inherits from a standard FSJ User and extends for Student specific attributes and methods
class Student(FSJUser):
program = models.ForeignKey(Program, on_delete = models.SET_NULL, null = True, blank = True, verbose_name = _("Program"))
year = models.ForeignKey(YearOfStudy, on_delete=models.PROTECT, verbose_name = _("Year"))
gpa = models.CharField(max_length = 10, null = True, blank = True, verbose_name = _("GPA"))
middle_name = models.CharField(max_length = 50, blank = True, verbose_name = _("Middle Name"))
student_id = models.CharField(max_length = 10, unique = True, verbose_name = _("U of A Student ID"), validators=[validate_student_id])
filters.py
from .models import *
import django_filters
from django.forms import CheckboxSelectMultiple, DateInput
from django.utils.translation import gettext_lazy as _
LOOKUP_TYPES = [
('icontains', _("contains"))
]
class StudentFilter(django_filters.FilterSet):
ccid = django_filters.CharFilter(lookup_expr='icontains')
first_name = django_filters.CharFilter(lookup_expr='icontains')
middle_name = django_filters.CharFilter(lookup_expr='icontains')
last_name = django_filters.CharFilter(lookup_expr='icontains')
student_id = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Student
fields = ['ccid','first_name','middle_name','last_name','student_id','year','program']
views.py
def coordinator_students(request):
FSJ_user = get_FSJ_user(request.user.username)
student_list = Student.objects.all().order_by('ccid')
filtered_list = StudentFilter(request.GET, queryset=student_list)
student_paginator = Paginator(filtered_list.qs, 25)
template = loader.get_template("FSJ/coord_student_list.html")
context = get_standard_context(FSJ_user)
context["student_list"] = student_list
page = request.GET.get('page', 1)
try:
students = student_paginator.page(page)
except PageNotAnInteger:
students = student_paginator.page(1)
except EmptyPage:
students = student_paginator.page(student_paginator.num_pages)
context["filter"] = filtered_list
context["students"] = students
return HttpResponse(template.render(context, request))
我已经解决了这个问题,但我会post这里的答案以防其他人遇到同样的问题。
我没有弄清楚问题的根源(虽然我现在怀疑是因为我定义了自定义过滤器而不是让它们自动生成);然而,我发现最有效的解决方案是在过滤器的 init 函数中分别为每个过滤器定义标签,如下所示:
def __init__(self, *args, **kwargs):
super(StudentFilter, self).__init__(*args, **kwargs)
# Adding custom translatable labels to autogenerated filters
self.filters['year'].label = _("Year:")
希望这对某人有所帮助。