Форум сайта python.su
Всем привет
С джангой только знакомлюсь.
Есть простая модель:
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
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)
Офлайн
Думаю проще перегрузить модель
class Pupil(models.Model):
school = models.ForeignKey(School)
Clas = models.ForeignKey(Clas)
FIO = models.CharField(max_length = 60)
Офлайн
GarisonА других способов нет?
Думаю проще перегрузить модельclass Pupil(models.Model):
school = models.ForeignKey(School)
Clas = models.ForeignKey(Clas)
FIO = models.CharField(max_length = 60)
Отредактировано (Фев. 10, 2011 13:17:01)
Офлайн
moro
В общем хочется, чтобы в админке когда просматриваешь список учеников, выводилось не только Clas и FIO, но еще и школа в которой они учаться.
class PupilAdmin(admin.ModelAdmin):
list_display = ('Clas', 'FIO', 'school')
def school(obj):
return obj.school.__unicode__()
Офлайн
Ошибка выдаётся: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
Офлайн
moro,
def school(self, obj)
Офлайн
Заработало без ошибок, появился столбец School, однако школа не написана… написано “(None)”
Офлайн
moroТогда либо перепишите метод, либо добавьте в модель школы метод __unicode__
Заработало без ошибок, появился столбец School, однако школа не написана… написано “(None)”
Офлайн
regall
Если честно, я не понял, что Вы предлагаете сделать…
и кстати, если у moro в списке пишет (None), то замена __str__ на __unicode__ не поможет.
Можно поподробнее, интересно просто.
Офлайн
У вас в модели есть внешний ключ на школу.
Соответственно добавление ‘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
Офлайн