Как конфликтуют мои list_display и list_editable?
Когда я начал создавать этот проект, все шло довольно гладко. Но когда я дошел до админки, list_display и list_editable вступили в конфликт:
admin.py Код:
from django.contrib import admin
from .models import Article, Author
# Register your models here.
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'main_txt', 'date_of_publication']
list_editable = ['title', 'main_txt']
def __str__(self):
return self.title
@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
list_display = ['first_name', 'last_name', 'join_date', 'email']
def __str__(self):
return f"{self.first_name} {self.last_name[0]}"
models.py:
from django.db import models
# Create your models here.
class Author(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
date_of_birth = models.DateField()
email = models.CharField(max_length=300)
phone_num = models.CharField(max_length=15)
join_date = models.DateField()
participated_art = models.ManyToManyField('Article', blank=True)
class Article(models.Model):
title = models.CharField(max_length=500)
date_of_publication = models.DateField()
creaters = models.ManyToManyField('Author', blank=False)
main_txt = models.TextField()
notes = models.TextField()
Код ошибки:
Exception in thread Django-main-thread:
Traceback (most recent call last):
File "C:\Users\Zhiyue\AppData\Local\Programs\Python\Python39\lib\threading.py", line 980, in _bootstrap_inner
self.run()
File "C:\Users\Zhiyue\AppData\Local\Programs\Python\Python39\lib\threading.py", line 917, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\Zhiyue\PycharmProjects\djangoProject1\venv\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper
fn(*args, **kwargs)
File "C:\Users\Zhiyue\PycharmProjects\djangoProject1\venv\lib\site-packages\django\core\management\commands\runserver.py", line 134, in inner_run
self.check(display_num_errors=True)
File "C:\Users\Zhiyue\PycharmProjects\djangoProject1\venv\lib\site-packages\django\core\management\base.py", line 546, in check
raise SystemCheckError(msg)
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:
ERRORS:
<class 'CodeJangoHome.admin.ArticleAdmin'>: (admin.E124) The value of 'list_editable[0]' refers to the first field in 'list_display' ('title'), which cannot be used unless 'list_display_links' is set.
System check identified 1 issue (0 silenced).
После того, как я прочитал ошибку, как показано выше, я попробовал добавить list_display_links = ['title', 'main_txt']
в код:
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'main_txt', 'date_of_publication']
list_editable = ['title', 'main_txt']
def __str__(self):
return self.title
Но это не сработало так, как должно было сработать. Я получил другую ошибку, которая была между list_display_links
и list_editable
:
Exception in thread django-main-thread:
Traceback (most recent call last):
File "C:\Users\Zhiyue\AppData\Local\Programs\Python\Python39\lib\threading.py", line 980, in _bootstrap_inner
self.run()
File "C:\Users\Zhiyue\AppData\Local\Programs\Python\Python39\lib\threading.py", line 917, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\Zhiyue\PycharmProjects\djangoProject1\venv\lib\site-packages\django\utils\autoreload.py", line 64, in wrapper
fn(*args, **kwargs)
File "C:\Users\Zhiyue\PycharmProjects\djangoProject1\venv\lib\site-packages\django\core\management\commands\runserver.py", line 134, in inner_run
self.check(display_num_errors=True)
File "C:\Users\Zhiyue\PycharmProjects\djangoProject1\venv\lib\site-packages\django\core\management\base.py", line 546, in check
raise SystemCheckError(msg)
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:
ERRORS:
<class 'CodeJangoHome.admin.ArticleAdmin'>: (admin.E123) The value of 'main_txt' cannot be in both 'list_editable' and 'list_display_links'.
<class 'CodeJangoHome.admin.ArticleAdmin'>: (admin.E123) The value of 'title' cannot be in both 'list_editable' and 'list_display_links'.
System check identified 2 issues (0 silenced).
Итак, со list_display, list_editable и list_display_links у меня проблема с их вписыванием в код в admin.py. Я не совсем понимаю, как их использовать, так что немного помощи было бы полезно.
Согласно документации django. Здесь
- Любое поле в
list_editable
должно быть также вlist_display
. Вы не можете редактировать поле, которое не отображается!- Одно и то же поле не может быть указано в
list_editable
иlist_display_links
- поле не может быть одновременно формой и ссылкой.
Так что в list_display_links
у вас должно быть поле, отличное от полей в list_editable
Django автоматически устанавливает первую колонку list_display
в качестве ссылки на форму изменений.
Вы можете либо добавить еще один столбец (рекомендуется), например
admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['__str__', 'title', 'main_txt', 'date_of_publication']
list_editable = ['title', 'main_txt']
def __str__(self):
return self.title
или явно установить list_display_links
на None
admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'main_txt', 'date_of_publication']
list_editable = ['title', 'main_txt']
list_display_links = None
def __str__(self):
return self.title
Вы получили следующую ошибку:
ОШИБКИ:
<class 'CodeJangoHome.admin.ArticleAdmin'>: (admin.E124) The значение 'list_editable[0]' относится к первому полю в 'list_display' ('title'), которое не может быть использовано, если только 'list_display_links' установлено.
Потому что по умолчанию 1-я колонка "title" является ссылкой, если вы не установили list_display_links и не попытались сделать ссылку редактируемой, присвоив ей list_editable, что невозможно сделать:
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
# ↓ Link
list_display = ['title', 'main_txt', 'date_of_publication']
list_editable = ['title', 'main_txt']
# ↑ Tries to make the link editable but impossible
def __str__(self):
return self.title
И вы получили следующие ошибки:
ОШИБКИ:
<class 'CodeJangoHome.admin.ArticleAdmin'>: (admin.E123) Значение 'title' не может находиться как в 'list_editable' и 'list_display_links'. <class 'CodeJangoHome.admin.ArticleAdmin'>: (admin.E123) The Значение 'main_txt' не может находиться как в 'list_editable', так и в 'list_display_links'.
Потому что вы назначили 'title'
и 'main_txt'
одновременно list_editable
и list_display_links
, как показано ниже, что невозможно, чтобы колонка была одновременно ссылкой и редактируемой:
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'main_txt', 'date_of_publication']
list_editable = ['title', 'main_txt']
# ↑Here↓ ↑Here↓ Impossible
list_display_links = ['title', 'main_txt']
def __str__(self):
return self.title
Чтобы решить ваши ошибки, добавьте list_display_links = ['date_of_publication']
, как показано ниже, чтобы отключить ссылку для 1-й колонки "title" и включить ссылку для 3-й колонки "date_of_publication", как показано ниже:
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'main_txt', 'date_of_publication']
list_editable = ['title', 'main_txt']
list_display_links = ['date_of_publication'] # Here
def __str__(self):
return self.title
Или добавьте list_display_links = None
, чтобы отключить ссылку для 1-й колонки "Заголовок", как показано ниже:
@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
list_display = ['title', 'main_txt', 'date_of_publication']
list_editable = ['title', 'main_txt']
list_display_links = None # Here
def __str__(self):
return self.title