Django:創建用戶模型報錯: (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 ]
最後,重啟服務,在界面進行功能驗證,發布會下新增賓客,就可以成功保存了。。。
PS:收獲的教訓:
學習過程中,犯錯並不可怕,前人的代碼,不一定在你的環境完全可編譯執行,遇到問題,耐心排查,每次解決問題的過程,就是提高的過程!
Django:創建用戶模型報錯: (admin.E108) The value of 'list_display[4]'解決方案