Найти - Пользователи
Полная версия: помогите с mptt!
Начало » Django » помогите с mptt!
1
reply
Пишу тест для студентов колледжа, решил что в django будет удобней. Назрел такой вопрос: Как использовать mptt в административном интерфейсе?
модель должна выглядеть след. образом:
-преподаватель
–ученик
—тест
—-вопрос теста
Singularity
Что такое “mptt”?
reply
В 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.

или проще говоря позволяет в модели использовать древовидную структуру (иерархия в БД)
Fibio
установите 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)
newca9h
Вот статья на тему отображения деревьев в админке. Нужно только часть FeinCMS установить. Ссылка.
reply
Спасибо вам за материал. Вариант, предложенный newca9h я раньше уже видел, сейчас даже сделал все как написано), возникла следующая проблема:
При добавлении связи по ключу (по parent), в интерфейсе куда-то пропадают записи причем все, что можно придумать на этот счет?
В admin.py
class CategoryAdmin(editor.TreeEditor):
    list_display = ('title',)
admin.site.register(Answers, CategoryAdmin)

в models.py
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)
nnmware
related_name='возможный_ответ' ?????? почему на-русском то?
Два поля title ??
Ну и называть поля модели с большой буквы некошерно вроде бы.
Вы модели для начала приведите в порядок, потом может кто подскажет по проблеме…
reply
БД я создал с 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,)

в admin.py
# -*- 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)
Спасибо nnmware за критику, так лучше?
P.S. Записи начинают исчезать при добавлении к parent 2-го child…
newca9h
Я вообще не вижу причин в вашем случае использовать related_name, так как у вас классы не наследуют друг друга и в одном классе два поля не ссылаются на один и тот же объект. Или я ошибаюсь? Во-вторых, зачем вам столько mptt структур. Вроде, изначально вкладываться должны были только вопросы теста? И еще, у вас что-ли вопрос в вопрос будет вкладываться? Просто если это отношения parent-child, то лучше использовать родной ForeignKey. Но это, то что я понял из ваших сообщений и беглом чтении вашего кода. Может вам лучше подумать над структурой ваших моделей? Ведь лишний функционал тоже зло.
reply
Благодарю newca9h за совет. Что-то я действительно увлекся и не туда полез. Согласен что лучше использовать “родной ForeignKey”.
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