Django多语言配置后执行makemigrations报错:Category无'n'字段
Django多语言配置报错:Category has no field named 'n'
问题场景
为Django项目添加3种语言支持,已完成settings.py和urls.py的配置修改,但执行makemigrations命令时触发以下错误:
django.core.exceptions.FieldDoesNotExist: Category has no field named 'n'
项目Models代码
from django.urls import reverse from django.db import models from django.utils.text import slugify from ckeditor_uploader.fields import RichTextUploadingField # Create your models here. class BaseModel(models.Model): created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) is_active = models.BooleanField(default=True) class Meta: abstract = True class Category(BaseModel): name = models.CharField(max_length=255) slug = models.SlugField(null=True, blank=True) def __str__(self): return self.name def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.name, allow_unicode=True) return super().save(*args, **kwargs) def get_absolute_url(self): return reverse('category_articles', args=[self.slug]) class Tag(BaseModel): name = models.CharField(max_length=255) def __str__(self): return self.name class Article(BaseModel): title = models.CharField(max_length=255, unique=True) slug = models.SlugField(null=True, blank=True) subtitle = models.CharField(max_length=255) image = models.FileField(upload_to="articles") description = RichTextUploadingField() views = models.PositiveIntegerField(default=0) category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="articles") tags = models.ManyToManyField(Tag, related_name="articles", null=True) def __str__(self): return f" {self.id} {self.title}" def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.title, allow_unicode=True) return super().save(*args, **kwargs) class Contact(BaseModel): name = models.CharField(max_length=255) email = models.EmailField() message = models.TextField() def __str__(self): return self.name
完整报错栈
Traceback (most recent call last): File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\django\db\models\options.py", line 681, in get_field return self.fields_map[field_name] KeyError: 'n' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "D:\OrderProjects\Omonatstyle\manage.py", line 22, in <module> main() File "D:\OrderProjects\Omonatstyle\manage.py", line 18, in main execute_from_command_line(sys.argv) File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\django\core\management\__init__.py", line 442, in execute_from_command_line utility.execute() File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\django\core\management\__init__.py", line 416, in execute django.setup() File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\django\__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\django\apps\registry.py", line 124, in populate app_config.ready() File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\apps.py", line 11, in ready handle_translation_registrations() File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\models.py", line 82, in handle_translation_registrations autodiscover() File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\models.py", line 28, in autodiscover import_module(module) File "C:\Users\SWORD\AppData\Local\Programs\Python\Python310\lib\importlib\__init__.py", line 126, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 688, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 883, in exec_module File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed File "D:\OrderProjects\Omonatstyle\news\translation.py", line 5, in <module> class CategoryTranslationOptions(TranslationOptions): File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\decorators.py", line 35, in wrapper translator.register(model_or_iterable, opts_class, **options) File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 538, in register self._register_single_model(model, opts) self._register_single_model(model, opts) self._register_single_model(model, opts) self._register_single_model(model, opts) File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 555, in _register_single_model self._register_single_model(model, opts) self._register_single_model(model, opts) File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 555, in _register_single_model self._register_single_model(model, opts) self._register_single_model(model, opts) File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 555, in _register_single_model self._register_single_model(model, opts) File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 555, in _register_single_model self._register_single_model(model, opts) File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 555, in _register_single_model self._register_single_model(model, opts) self._register_single_model(model, opts) self._register_single_model(model, opts) self._register_single_model(model, opts) File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 555, in _register_single_model add_translation_fields(model, opts) File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\translator.py", line 199, in add_translation_fields translation_field = create_translation_field( File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\modeltranslation\fields.py", line 79, in create_translation_field field = cast(fields.Field, model._meta.get_field(field_name)) File "D:\OrderProjects\Omonatstyle\venv\lib\site-packages\django\db\models\options.py", line 683, in get_field raise FieldDoesNotExist( django.core.exceptions.FieldDoesNotExist: Category has no field named 'n'
问题原因
从报错栈可以定位到错误来自news/translation.py第5行的CategoryTranslationOptions类,说明多语言翻译配置中指定了不存在的字段名n,大概率是以下两种情况:
- 拼写错误:把
Category模型中的name字段误写成了n; - 语法错误:配置
fields时的语法错误,例如字段名被错误拆分(比如换行时引号未正确闭合,导致解析出单个字符n)。
解决方案
- 打开
news/translation.py文件,检查CategoryTranslationOptions类的fields配置,确保字段名与Category模型中的字段完全一致; - 正确的配置示例如下:
from modeltranslation.translator import register, TranslationOptions from .models import Category @register(Category) class CategoryTranslationOptions(TranslationOptions): fields = ('name', 'slug') # 这里的字段名必须和models.py中的字段完全匹配
- 检查其他模型的翻译配置,避免出现类似的拼写或语法错误;
- 修正配置后,重新执行命令:
python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者Jakhongir Abdikayumov
相关产品推荐
相关产品推荐

