Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 9, 2011 21:22:34

moro
От:
Зарегистрирован: 2011-01-27
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

отображение списка в админке

Всем привет

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

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

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, но еще и школа в которой они учаться.

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

Благодарю.



Офлайн

#2 Фев. 9, 2011 21:29:39

Garison
От:
Зарегистрирован: 2010-07-04
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

отображение списка в админке

Думаю проще перегрузить модель

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



Офлайн

#3 Фев. 10, 2011 13:16:40

moro
От:
Зарегистрирован: 2011-01-27
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

отображение списка в админке

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

Просто:
1) Менять структуру базы из-за внешнего вида не есть хорошо. Тем более, что в этом случае ученику можно задать школу A и класс, который нахотится в школе B.
2) Что делать если цепочка увеличиться? Например будут ещё классы Город и Район (то есть школа находится в районе, район в городе). Тогда чтобы увидеть город и район у ученика нужно будеть ещё 2 внешних ключа подключать?



Отредактировано (Фев. 10, 2011 13:17:01)

Офлайн

#4 Фев. 10, 2011 13:26:58

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

отображение списка в админке

moro
В общем хочется, чтобы в админке когда просматриваешь список учеников, выводилось не только Clas и FIO, но еще и школа в которой они учаться.
class PupilAdmin(admin.ModelAdmin):    
list_display = ('Clas', 'FIO', 'school')

def school(obj):
return obj.school.__unicode__()



Офлайн

#5 Фев. 11, 2011 10:29:37

moro
От:
Зарегистрирован: 2011-01-27
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

отображение списка в админке

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



Офлайн

#6 Фев. 11, 2011 10:41:50

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

отображение списка в админке

moro,

def school(self, obj)



Офлайн

#7 Фев. 11, 2011 10:53:51

moro
От:
Зарегистрирован: 2011-01-27
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

отображение списка в админке

Заработало без ошибок, появился столбец School, однако школа не написана… написано “(None)”



Офлайн

#8 Фев. 11, 2011 10:59:58

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

отображение списка в админке

moro
Заработало без ошибок, появился столбец School, однако школа не написана… написано “(None)”
Тогда либо перепишите метод, либо добавьте в модель школы метод __unicode__



Офлайн

#9 Фев. 11, 2011 21:16:17

EvgIq
От:
Зарегистрирован: 2009-11-14
Сообщения: 57
Репутация: +  0  -
Профиль   Отправить e-mail  

отображение списка в админке

regall
Если честно, я не понял, что Вы предлагаете сделать…
и кстати, если у moro в списке пишет (None), то замена __str__ на __unicode__ не поможет.
Можно поподробнее, интересно просто.



Офлайн

#10 Фев. 11, 2011 22:56:55

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

отображение списка в админке

У вас в модели есть внешний ключ на школу.
Соответственно добавление ‘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 вычисляется от обьекта, выбирая проект, к которому прикреплена задача



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version