у меня:
django 2.0.5, python 3.6.4 x64, Win7 тоже x64
(клон на virtualenv-е)
весь прожект прикреплен тут в архиве
так вот,
благополучно делаю вот этот пример (django pools):
https://djangosimple.blogspot.com/2012/02/32.html
все работает, и в самом конце статьи
в файле pools/admin.py
предлагается добавить date_hierarchy (что я и делаю) в классе
class QuestionAdmin(admin.ModelAdmin): .... date_hierarchy = ['date_published']
получаю вот это:
AttributeError: ‘list’ object has no attribute ‘split’
..... File "G:\_py_projects\_clones\py36virt01\lib\site-packages\django\contrib\admin\utils.py ", line 483, in get_fields_from_path pieces = path.split(LOOKUP_SEP) AttributeError: 'list' object has no attribute 'split' Завершить выполнение пакетного файла [Y(да)/N(нет)]? y
файл pools/admin.py:
#-------------------------- from django.contrib import admin # Register your models here. from .models import Question, Answer """ class QuestionAdmin(admin.ModelAdmin): fields = ['is_active', 'date_published', 'title'] # fields = ['date_published', 'title'] """ #class AnswerInline(admin.StackedInline): class AnswerInline(admin.TabularInline): model = Answer extra = 2 class QuestionAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['title', 'is_active']} ), ('Информация о дате', {'fields': ['date_published'], 'classes': ['collapse']} ), ] inlines = [AnswerInline] #list_display = ('title', 'date_published', 'is_active') # # !!! (ч.3.2) Добавим название метода модели is_popular() list_display = ('title', 'date_published', 'is_active', 'is_popular') list_filter = ['date_published'] search_fields = ['title'] date_hierarchy = ['date_published'] # !!! вот тут ошибка """ File "G:\_py_projects\_clones\py36virt01\lib\site-packages\django\contrib\admin\utils.py ", line 483, in get_fields_from_path pieces = path.split(LOOKUP_SEP) AttributeError: 'list' object has no attribute 'split' Завершить выполнение пакетного файла [Y(да)/N(нет)]? y """ admin.site.register(Question, QuestionAdmin)
pools/models.py на всякий случай:
#---------------- from django.db import models # Create your models here. import datetime from django.db import models #====================== # Импортируем настройки приложения polls # import settings # !!! (ч.3.2) # <== было в оригинале - так не хочет from polls import settings # < == пришлось сделать так #====================== class Question(models.Model): """Вопрос""" title = models.CharField(max_length=200, verbose_name = "Вопрос") date_published = models.DateTimeField(verbose_name = "Дата публикации", default = datetime.datetime.now()) is_active = models.BooleanField(verbose_name = "Опубликован") # !!! (ч.3.2) Этот метод позволяет выявить Популярный опрос для показа в админке """ def is_popular(self): answers = Answer.objects.filter(question_id=self.id) votes_total = sum([answer.votes for answer in answers]) return votes_total > settings.POLLS_POPULAR_VOTES_LIMIT """ """ def is_popular(self): # !!! не показывает иконки, # а только html текст answers = Answer.objects.filter(question_id=self.id) votes_total = sum([answer.votes for answer in answers]) if votes_total > settings.POLLS_POPULAR_VOTES_LIMIT: img_path = settings.IMG_TRUE_PATH else: img_path = settings.IMG_FALSE_PATH return '<img alt="" src="{}" />'.format(img_path) """ def is_popular(self): # !!! уже 3-й вариант !!! этот показывает иконки answers = Answer.objects.filter(question_id=self.id) votes_total = sum([answer.votes for answer in answers]) return votes_total > settings.POLLS_POPULAR_VOTES_LIMIT # !!! (ч.3.2) Описание столбца в админке is_popular.short_description = 'Популярный' # Важно указать эту настройку, чтобы django не экранировал тэги ## is_popular.allow_tags = True ## !!! убираю, т.к. ее заменяет то, что ниже # Обратите внимание, мы укзали настройку is_popular.allow_tags = True. # Она позволяет нам избежать экранирования и вывести html теги прямо из модели: # Вот настройка, заменяющая False/True на иконки в админке is_popular.boolean = True def __str__(self): return self.title class Meta: verbose_name = 'Вопрос' verbose_name_plural = 'Вопросы' class Answer(models.Model): """Вариант ответа на вопрос""" question_id = models.ForeignKey(Question, on_delete=models.CASCADE) answer = models.CharField(max_length=200, verbose_name = "Ответ") votes = models.IntegerField(verbose_name = "Голосов", default = 0) def __str__(self): return self.answer class Meta: verbose_name = 'Ответ' verbose_name_plural = 'Ответы'