#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)
Комментариев нет:
Отправить комментарий