Django模型使用MultiSelectField出现IndexError报错求助
Django汽车项目模型代码报错排查
问题场景
运行Django汽车项目的模型代码时触发错误,以下是模型代码及报错信息,需要排查问题原因并解决。
模型代码
from django.db import models from datetime import datetime from ckeditor.fields import RichTextField from multiselectfield import MultiSelectField # Create your models here. class Car(models.Model): state_choice = ( ('AL', 'Alabama'), ('AK', 'Alaska'), ('AZ', 'Arizona'), ('AR', 'Arkansas'), ('CA', 'California'), ('CO', 'Colorado'), ('CT', 'Connecticut'), ('DE', 'Delaware'), ('DC', 'District Of Columbia'), ('FL', 'Florida'), ('GA', 'Georgia'), ('HI', 'Hawaii'), ('ID', 'Idaho'), ('IL', 'Illinois'), ('IN', 'Indiana'), ('IA', 'Iowa'), ('KS', 'Kansas'), ('KY', 'Kentucky'), ('LA', 'Louisiana'), ('ME', 'Maine'), ('MD', 'Maryland'), ('MA', 'Massachusetts'), ('MI', 'Michigan'), ('MN', 'Minnesota'), ('MS', 'Mississippi'), ('MO', 'Missouri'), ('MT', 'Montana'), ('NE', 'Nebraska'), ('NV', 'Nevada'), ('NH', 'New Hampshire'), ('NJ', 'New Jersey'), ('NM', 'New Mexico'), ('NY', 'New York'), ('NC', 'North Carolina'), ('ND', 'North Dakota'), ('OH', 'Ohio'), ('OK', 'Oklahoma'), ('OR', 'Oregon'), ('PA', 'Pennsylvania'), ('RI', 'Rhode Island'), ('SC', 'South Carolina'), ('SD', 'South Dakota'), ('TN', 'Tennessee'), ('TX', 'Texas'), ('UT', 'Utah'), ('VT', 'Vermont'), ('VA', 'Virginia'), ('WA', 'Washington'), ('WV', 'West Virginia'), ('WI', 'Wisconsin'), ('WY', 'Wyoming'), ) year_choice = [] for r in range(2000, (datetime.now().year+1)): year_choice.append((r,r)) features_choices = ( ('Cruise Control', 'Cruise Control'), ('Audio Interface', 'Audio Interface'), ('Airbags', 'Airbags'), ('Air Conditioning', 'Air Conditioning'), ('Seat Heating', 'Seat Heating'), ('Alarm System', 'Alarm System'), ('ParkAssist', 'ParkAssist'), ('Power Steering', 'Power Steering'), ('Reversing Camera', 'Reversing Camera'), ('Direct Fuel Injection', 'Direct Fuel Injection'), ('Auto Start/Stop', 'Auto Start/Stop'), ('Wind Deflector', 'Wind Deflector'), ('Bluetooth Handset', 'Bluetooth Handset'), ) door_choices = ( ('2', '2'), ('3', '3'), ('4', '4'), ('5', '5'), ('6', '6'), ) car_title = models.CharField(max_length=255) state = models.CharField(choices=state_choice, max_length=100) city = models.CharField(max_length=100) color = models.CharField(max_length=100) model = models.CharField(max_length=100) year = models.IntegerField(('year'), choices=year_choice) condition = models.CharField(max_length=100) price = models.IntegerField() description = RichTextField() car_photo = models.ImageField(upload_to='photos/%Y/%m/%d/') car_photo_1 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True) car_photo_2 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True) car_photo_3 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True) car_photo_4 = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True) features = MultiSelectField(choices=features_choices) body_style = models.CharField(max_length=100) engine = models.CharField(max_length=100) transmission = models.CharField(max_length=100) interior = models.CharField(max_length=100) miles = models.IntegerField() doors = models.CharField(choices=door_choices, max_length=10) passengers = models.IntegerField() vin_no = models.CharField(max_length=100) milage = models.IntegerField() fuel_type = models.CharField(max_length=50) no_of_owners = models.CharField(max_length=100) is_featured = models.BooleanField(default=False) created_date = models.DateTimeField(default=datetime.now, blank=True) def __str__(self): return self.car_title
报错信息
Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/threading.py", line 1009, in _bootstrap_inner self.run() File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/threading.py", line 946, in run self._target(*self._args, **self._kwargs) File "/Users/admin/django/django/utils/autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "/Users/admin/django/django/core/management/commands/runserver.py", line 125, in inner_run autoreload.raise_last_exception() File "/Users/admin/django/django/utils/autoreload.py", line 87, in raise_last_exception raise _exception[1] File "/Users/admin/django/django/core/management/__init__.py", line 394, in execute autoreload.check_errors(django.setup)() File "/Users/admin/django/django/utils/autoreload.py", line 64, in wrapper fn(*args, **kwargs) File "/Users/admin/django/django/__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "/Users/admin/django/django/apps/registry.py", line 116, in populate app_config.import_models() File "/Users/admin/django/django/apps/config.py", line 269, in import_models self.models_module = import_module(models_module_name) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/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 "/Users/admin/Desktop/Car Project/cars/models.py", line 7, in <module> class Car(models.Model): File "/Users/admin/Desktop/Car Project/cars/models.py", line 105, in Car features = MultiSelectField(choices=features_choices) File "/Users/admin/env/lib/python3.10/site-packages/multiselectfield/db/fields.py", line 72, in __init__ self.validators[0] = MaxValueMultiFieldValidator(self.max_length) IndexError: list assignment index out of range
问题原因及解决方案
原因
报错来自multiselectfield库的字段初始化逻辑:当未指定max_length参数时,字段的validators列表为空,代码尝试替换列表的第0个元素时触发索引越界错误。
解决方法
给features字段的MultiSelectField添加max_length参数,值根据实际选中的选项总长度设置(比如255,足够容纳多个选项的字符串拼接):
修改模型中features字段的定义:
features = MultiSelectField(choices=features_choices, max_length=255)
修改后重新运行项目即可解决该错误。
内容的提问来源于stack exchange,提问作者Popeye
相关产品推荐
相关产品推荐

