Как конфликтуют мои 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
Вернуться на верх