Страницы

Поиск по вопросам

понедельник, 13 апреля 2020 г.

Как вывести в админке django столбец из связи многие ко многим?

#python #django

                    
Здравствуйте! Подскажите, пожалуйста, как вывести в админке django столбец из связи
многие ко многим?
Пример:
Есть модель  books и author:
class books(models.Model):
    name = models.CharField(max_length=50, verbose_name=u'Название книги')
    year = models.IntegerField(max_length=10, verbose_name=u'Год выпуска')
    author = models.ManyToManyField(author)

class author(models.Model):
    full_name = models.CharField(max_length=50, verbose_name=u'Автор')

Содержание admin.py:
from django.contrib import admin
from support.models import books, author

class BooksAdmin(admin.ModelAdmin):
    list_display = ('name', 'year', 'ЧТО_ТУТ_НАПИСАТЬ?')

admin.site.register(books, BooksAdmin)

Что нужно написать, что бы появился третий столбец, в котором будут отображаться
авторы книга (через перенос строки).    


Ответы

Ответ 1



Чтобы появился третий столбец, в котором будут отображаться авторы книги через запятую. #models.py class Books(models.Model): name = models.CharField(max_length=50, verbose_name=u'Название книги') year = models.IntegerField(max_length=10, verbose_name=u'Год выпуска') authors = models.ManyToManyField(Author) def author_names(self): return u" %s" % (u", ".join([author.full_name for author in self.authors.all()])) author_names.short_description=u'Авторы' def __unicode__(self): return self.name class Author(models.Model): full_name = models.CharField(max_length=50, verbose_name=u'Автор') def __unicode__(self): return self.full_name #admin.py: from django.contrib import admin from support.models import books, author class BooksAdmin(admin.ModelAdmin): list_display = ('name', 'year', 'author_names') admin.site.register(books, BooksAdmin)

Ответ 2



Напрямую - никак ManyToManyField fields aren’t supported, because that would entail executing a separate SQL statement for each row in the table. If you want to do this nonetheless, give your model a custom method, and add that method’s name to list_display. (See below for more on custom methods in list_display.)

Ответ 3



#models.py python3 django 1.11 from django.db import models class Author(models.Model): full_name = models.CharField(max_length=50, verbose_name='Автор') def __str__(self): return self.full_name class Books(models.Model): name = models.CharField(max_length=50, verbose_name='Название книги') year = models.IntegerField( verbose_name='Год выпуска') authors = models.ManyToManyField(Author) def __str__(self): return self.name #admin.py from django.contrib import admin from .models import Books, Author from itertools import chain class BooksAdmin(admin.ModelAdmin): def author_names(self, obj): a = obj.authors.values_list('full_name') return list(chain.from_iterable(a)) list_display = ('name', 'year', 'author_names') admin.site.register(Books, BooksAdmin) admin.site.register(Author)

Комментариев нет:

Отправить комментарий