Найти - Пользователи
Полная версия: отображение списка в админке
Начало » Django » отображение списка в админке
1 2
moro
Всем привет

С джангой только знакомлюсь.

Есть простая модель:

from django.db import models

class School(models.Model):
number = models.IntegerField()
sc_type = models.CharField(max_length = 20)

def __str__(self):
return str(self.number)

class Clas(models.Model):
school = models.ForeignKey(School)
number = models.IntegerField()
letter = models.CharField(max_length = 2)

def __str__(self):
return str(self.number) + self.letter

class Pupil(models.Model):
Clas = models.ForeignKey(Clas)
FIO = models.CharField(max_length = 60)

def __str__(self):
return self.FIO
файл admin.py для неё вот такой:

from django.contrib import admin
from testpr.schools.models import School, Clas, Pupil

class SchoolAdmin(admin.ModelAdmin):
list_display = ('number', 'sc_type')

class ClasAdmin(admin.ModelAdmin):
list_display = ('school', 'number', 'letter')

class PupilAdmin(admin.ModelAdmin):
list_display = ('Clas', 'FIO')

admin.site.register(School, SchoolAdmin)
admin.site.register(Clas, ClasAdmin)
admin.site.register(Pupil, PupilAdmin)
В общем хочется, чтобы в админке когда просматриваешь список учеников, выводилось не только Clas и FIO, но еще и школа в которой они учаться.

Можно ли это сделать?

Благодарю.
Garison
Думаю проще перегрузить модель
class Pupil(models.Model):
school = models.ForeignKey(School)
Clas = models.ForeignKey(Clas)
FIO = models.CharField(max_length = 60)
moro
Garison
Думаю проще перегрузить модель
class Pupil(models.Model):
school = models.ForeignKey(School)
Clas = models.ForeignKey(Clas)
FIO = models.CharField(max_length = 60)
А других способов нет?

Просто:
1) Менять структуру базы из-за внешнего вида не есть хорошо. Тем более, что в этом случае ученику можно задать школу A и класс, который нахотится в школе B.
2) Что делать если цепочка увеличиться? Например будут ещё классы Город и Район (то есть школа находится в районе, район в городе). Тогда чтобы увидеть город и район у ученика нужно будеть ещё 2 внешних ключа подключать?
regall
moro
В общем хочется, чтобы в админке когда просматриваешь список учеников, выводилось не только Clas и FIO, но еще и школа в которой они учаться.
class PupilAdmin(admin.ModelAdmin):    
list_display = ('Clas', 'FIO', 'school')

def school(obj):
return obj.school.__unicode__()
moro
class PupilAdmin(admin.ModelAdmin):    
list_display = ('Clas', 'FIO', 'school')

def school(obj):
return obj.school.__unicode__()
Ошибка выдаётся:

Exception Type:	TemplateSyntaxError
Exception Value: Caught TypeError while rendering: school() takes exactly 1 argument (2 given)
Exception Location: /usr/local/lib/python2.6/dist-packages/django/contrib/admin/util.py in lookup_field, line 267
regall
moro,
def school(self, obj)
moro
Заработало без ошибок, появился столбец School, однако школа не написана… написано “(None)”
regall
moro
Заработало без ошибок, появился столбец School, однако школа не написана… написано “(None)”
Тогда либо перепишите метод, либо добавьте в модель школы метод __unicode__
EvgIq
regall
Если честно, я не понял, что Вы предлагаете сделать…
и кстати, если у moro в списке пишет (None), то замена __str__ на __unicode__ не поможет.
Можно поподробнее, интересно просто.
regall
У вас в модели есть внешний ключ на школу.
Соответственно добавление ‘school’ в list_display выведет строковое представление связанного объекта.
Если вам требуется какой-то вычисляемый кастомный атрибут, делаете метод, которому передаете аргумент obj, который и есть конкретным выводимым объектом из списка.
Привожу пример работающего кода:
class Project(models.Model):

title = models.CharField(max_length=255,
verbose_name=_(u"Title"))

class Task(models.Model):

summary = models.CharField(max_length=255,
verbose_name=_(u'Summary'))
short_description = models.TextField(null=True, blank=True)
order = models.PositiveIntegerField(verbose_name = _(u"Number"))
project = models.ForeignKey(Project, related_name='tasks',
verbose_name=_(u'Project'))


class TaskAdmin(admin.ModelAdmin):

list_display = ('summary', 'ptoject')

def ptoject(self, obj):
return obj.project.title
В админ-модели ptoject вычисляется от обьекта, выбирая проект, к которому прикреплена задача
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB