(admin.E108) The value of 'list_display[4]'報錯解決方案


參考資料:蟲師-《web接口開發與自動化測試:基於python語言》

日常學習Django框架中,創建了用戶模型,但是頁面功能驗證時候,提示不能進行列表字段操作,debug好久,才找到問題原因,心累。。。

下面是大概過程和解決方案。。。

 

models.py文件代碼:

 1 from django.db import models  2 
 3 # Create your models here.
 4 # 發布會表
 5 class Event(models.Model):  6     name = models.CharField(max_length=100)              # 發布會標題
 7     limit = models.IntegerField()                        # 參加人數
 8     status = models.BooleanField()                       # 狀態
 9     address = models.CharField(max_length=200)           # 地址
10     start_time = models.DateTimeField('event time')      # 發布會時間
11     create_time = models.DateTimeField(auto_now=True)    # 創建時間(自動獲取當前時間)
12 
13     def __str__(self): 14         return self.name 15 
16 # 嘉賓表
17 class Guest(models.Model): 18     event = models.ForeignKey('Event','on_delete=models.CASCADE,')   # 關聯發布會
19     realname = models.CharField(max_length=64)                       # 姓名
20     phone = models.CharField(max_length=16)                          # 手機號
21     email = models.EmailField()                                      # 郵箱
22     sign = models.BooleanField()                                     # 簽到狀態
23 create_time = models.DateTimeField(auto_now=True)                # 創建時間(自動獲取當前時間)
24 
25 class Meta: 26     unique_together = ("event", "phone") 27 
28 def __str__(self): 29     return self.realname

代碼解析:

①、創建發布會表(Event類)和嘉賓表(Guest類);

②、兩個表中默認生成自增ID,但不需要聲明;

③、嘉賓表中中通過event字段(字段名event_id)關聯發布會ID,ForeignKey()用來創建外鍵;

④、用發布會ID和手機號作為聯合主鍵,Meta是Django模型類的一個內部類,用於定義行為特性,unique_together用於設置兩個字段為聯合主鍵(event和phone);

命令行執行數據遷移操作:

然后在進入后台管理界面,選擇Guests,點擊添加,然后保存;

神奇的事情來了,提示如下:

ERRORS:

<class 'sign.admin.GuestAdmin'>: (admin.E108) The value of 'list_display[4]'

檢查了很多次代碼,在Stack Overflow也找到了類似的問題,最后從頭檢查代碼,才發現是models文件第23行創建時間的代碼沒有縮進,執行數據遷移時數據庫沒有對應字段導致的報錯。

對應的數據遷移文件代碼如下

 1 # Generated by Django 2.0 on 2018-03-05 13:03
 2 
 3 from django.db import migrations, models  4 
 5 
 6 class Migration(migrations.Migration):  7 
 8     initial = True  9 
10     dependencies = [ 11  ] 12 
13     operations = [ 14  migrations.CreateModel( 15             name='Event', 16             fields=[ 17                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18                 ('name', models.CharField(max_length=100)), 19                 ('limit', models.IntegerField()), 20                 ('status', models.BooleanField()), 21                 ('address', models.CharField(max_length=200)), 22                 ('start_time', models.DateTimeField(verbose_name='event time')), 23                 ('create_time', models.DateTimeField(auto_now=True)), 24  ], 25  ), 26  migrations.CreateModel( 27             name='Guest', 28             fields=[ 29                 ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 30                 ('realname', models.CharField(max_length=64)), 31                 ('phone', models.CharField(max_length=16)), 32                 ('email', models.EmailField(max_length=254)), 33                 ('sign', models.BooleanField()), 34                 ('event', models.ForeignKey(on_delete='on_delete=models.CASCADE,', to='sign.Event')), 35  ], 36  ), 37     ]

問題的原因是啥捏,我是照着書里面的代碼擼的,寫的時候也沒注意到有一行代碼沒有縮進,然后導致了沒有對應字段,然后保存報錯!!!

只想說,對python這種語言來說,縮進格式真的很重要!!!

還有,之前看蟲師的selenium自動化那本書的時候,就有很多代碼有編寫錯誤,這次又遇到了,不知道說啥了,心好累。。。

最后的解決方案如下:

修改models文件,縮進保持一致,然后重新執行數據遷移操作,由於上次建表少create_time字段,這次執行數據遷移,只是執行了一個更新操作,並未對已有的表字段進行修改。

Django里面,這種操作不是覆蓋式的,而是通過新增來解決,對應的遷移文件如下:

 1 # Generated by Django 2.0 on 2018-03-05 14:30
 2 
 3 from django.db import migrations, models  4 
 5 
 6 class Migration(migrations.Migration):  7 
 8     dependencies = [  9         ('sign', '0001_initial'), 10  ] 11 
12     operations = [ 13  migrations.AddField( 14             model_name='guest', 15             name='create_time', 16             field=models.DateTimeField(auto_now=True), 17  ), 18     ]

最后,重啟服務,在界面進行功能驗證,發布會下新增賓客,就可以成功保存了。。。

附:django-API文檔

 

PS:收獲的教訓:

學習過程中,犯錯並不可怕,前人的代碼,不一定在你的環境完全可編譯執行,遇到問題,耐心排查,每次解決問題的過程,就是提高的過程!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM