Форум сайта python.su
Пишу тест для студентов колледжа, решил что в django будет удобней. Назрел такой вопрос: Как использовать mptt в административном интерфейсе?
модель должна выглядеть след. образом:
-преподаватель
–ученик
—тест
—-вопрос теста
Офлайн
Что такое “mptt”?
Офлайн
В Debian это пакет python-django-mptt
Django MPTT is a reusable/standalone Django application which aims to make it easy for you to use Modified Preorder Tree Traversal with your own Django models in your own applications.
или проще говоря позволяет в модели использовать древовидную структуру (иерархия в БД)
Офлайн
установите FeinCMS: http://feincms-django-cms.readthedocs.org/en/v1.6.0/
затем заюзайте mptt.admin.FeinCMSModelAdmin базовой админ модели для вашей mptt модели:
from mptt.admin import FeinCMSModelAdmin admin.site.register(Category, FeinCMSModelAdmin)
Офлайн
Вот статья на тему отображения деревьев в админке. Нужно только часть FeinCMS установить. Ссылка.
Офлайн
Спасибо вам за материал. Вариант, предложенный newca9h я раньше уже видел, сейчас даже сделал все как написано), возникла следующая проблема:
При добавлении связи по ключу (по parent), в интерфейсе куда-то пропадают записи причем все, что можно придумать на этот счет?
В admin.py
class CategoryAdmin(editor.TreeEditor): list_display = ('title',) admin.site.register(Answers, CategoryAdmin)
class Answers(models.Model): title = models.CharField('ответ', max_length=255) TrueAnswer = models.BooleanField(verbose_name='правильность ответа да/нет') Answer = models.CharField(max_length=100, verbose_name='возможный ответ') parent = models.ForeignKey('SomeQuestion', blank=True, null=True, verbose_name="вопрос", related_name='возможный_ответ') title = models.CharField('Название', max_length=255)
Офлайн
related_name='возможный_ответ' ?????? почему на-русском то?
Два поля title ??
Ну и называть поля модели с большой буквы некошерно вроде бы.
Вы модели для начала приведите в порядок, потом может кто подскажет по проблеме…
Офлайн
БД я создал с UTF-8: “CREATE DATABASE tester CHARSET=UTF8;” отображается все корректно, имхо ошибок быть не должно.
Вот как выглядит весь model.py
# -*- coding: utf-8 -*- from django.db import models class Answers(models.Model): title = models.CharField('ответ', max_length=255) trueAnswer = models.BooleanField(verbose_name='правильность ответа да/нет') answer = models.CharField(max_length=100, verbose_name='возможный ответ') parent = models.ForeignKey('SomeQuestion', blank=True, null=True, verbose_name="вопрос", related_name='возможный_ответ') title = models.CharField('Название', max_length=255) def __unicode__(self): return self.answer class SomeQuestion(models.Model): question = models.CharField(max_length=100, verbose_name='вопрос') parent = models.ForeignKey('SomeTest', blank=True, null=True, verbose_name="тест", related_name='вопрос') title = models.CharField('Название', max_length=255) def __unicode__(self): return self.question class SomeTest(models.Model): testName = models.CharField(max_length=30, verbose_name='имя теста') quantityQuestion = models.CharField(max_length=30, verbose_name='кол-во вопросов') parent = models.ForeignKey('SomeStudent', blank=True, null=True, verbose_name="студент", related_name='тест') title = models.CharField('Название', max_length=255) def __unicode__(self): return self.testName class SomeStudent(models.Model): firstName = models.CharField(max_length=30, verbose_name='имя') secondName = models.CharField(max_length=30, verbose_name='фамилия') group = models.CharField(max_length=30, verbose_name='группа') user = models.CharField(max_length=30, verbose_name='пользователь') password = models.CharField(max_length=30, verbose_name='пароль') rating = models.CharField(max_length=30, verbose_name='оценка') parent = models.ForeignKey('SomeTeacher', blank=True, null=True, verbose_name="преподаватель", related_name='студент') title = models.CharField('Название', max_length=255) def __unicode__(self): return self.firstName class SomeTeacher(models.Model): firstName = models.CharField(max_length=30, verbose_name='имя') secondName = models.CharField(max_length=30, verbose_name='фамилия') email = models.EmailField(blank=True, verbose_name='e-mail') user = models.CharField(max_length=30, verbose_name='пользователь') password = models.CharField(max_length=30, verbose_name='пароль') title = models.CharField('Название', max_length=255) parent = models.ForeignKey('self', blank=True, null=True, verbose_name="преподаватель", related_name='преподаватель') def __unicode__(self): return self.firstName mptt.register(Answers,) mptt.register(SomeQuestion,) mptt.register(SomeTest,) mptt.register(SomeStudent,) mptt.register(SomeTeacher,)
# -*- coding: utf-8 -*- from django.contrib import admin from feincms.admin import editor from student.models import SomeTest, SomeStudent, SomeQuestion, Answers, SomeTeacher class CategoryAdmin(editor.TreeEditor): list_display = ('title',) admin.site.register(Answers, CategoryAdmin) admin.site.register(SomeQuestion, CategoryAdmin) admin.site.register(SomeTest, CategoryAdmin) admin.site.register(SomeStudent, CategoryAdmin) admin.site.register(SomeTeacher, CategoryAdmin)
Отредактировано reply (Фев. 9, 2013 13:06:19)
Офлайн
Я вообще не вижу причин в вашем случае использовать related_name, так как у вас классы не наследуют друг друга и в одном классе два поля не ссылаются на один и тот же объект. Или я ошибаюсь? Во-вторых, зачем вам столько mptt структур. Вроде, изначально вкладываться должны были только вопросы теста? И еще, у вас что-ли вопрос в вопрос будет вкладываться? Просто если это отношения parent-child, то лучше использовать родной ForeignKey. Но это, то что я понял из ваших сообщений и беглом чтении вашего кода. Может вам лучше подумать над структурой ваших моделей? Ведь лишний функционал тоже зло.
Отредактировано newca9h (Фев. 9, 2013 13:18:04)
Офлайн
Благодарю newca9h за совет. Что-то я действительно увлекся и не туда полез. Согласен что лучше использовать “родной ForeignKey”.
Офлайн