Расширение Django FlatPages для использования MPTT - PullRequest
0 голосов
/ 08 августа 2011

Предисловие: я писал свое собственное приложение Page, которое использовало MPTT и пользовательскую модель страницы.Это работало для меня, но FlatPages более усовершенствован, чем моя пользовательская модель страницы, и поэтому я склоняюсь к его расширению.

from django.db import models
from django.contrib.flatpages.models import FlatPage
from mptt.models import MPTTModel

class ExtendedFlatPage(FlatPage, MPTTModel):

    parent = models.ForeignKey('ExtendedFlatPage', null=True, blank=True, default=None, related_name="children", help_text="Hierarchical parent page (if any)")

    class Meta:
        ordering = ['flatpages__url']
        order_with_respect_to = 'parent'
        verbose_name = 'page'
        verbose_name_plural = 'pages'

    class MPTTMeta:
        left_attr = 'mptt_left'
        right_attr = 'mptt_right'
        level_attr = 'mptt_level'
        order_insertion_by = ['title']

    def __unicode__(self):
        return self.url

Это почти работает, за исключением того, что выдает ошибку, когда я иду на бег python manage.py syncdb

Ошибка:

iMac:cms colab$ python manage.py syncdb
Creating tables ...
Creating table my_flatpages_extendedflatpage
Traceback (most recent call last):
  File "manage.py", line 14, in <module>
    execute_manager(settings)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Django-1.3-py2.7.egg/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Django-1.3-py2.7.egg/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Django-1.3-py2.7.egg/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Django-1.3-py2.7.egg/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Django-1.3-py2.7.egg/django/core/management/base.py", line 351, in handle
    return self.handle_noargs(**options)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Django-1.3-py2.7.egg/django/core/management/commands/syncdb.py", line 101, in handle_noargs
    cursor.execute(statement)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Django-1.3-py2.7.egg/django/db/backends/util.py", line 34, in execute
    return self.cursor.execute(sql, params)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/Django-1.3-py2.7.egg/django/db/backends/mysql/base.py", line 86, in execute
    return self.cursor.execute(query, args)
  File "build/bdist.macosx-10.6-intel/egg/MySQLdb/cursors.py", line 174, in execute
  File "build/bdist.macosx-10.6-intel/egg/MySQLdb/connections.py", line 36, in defaulterrorhandler
django.db.utils.DatabaseError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 2")

Если бы кто-нибудь мог указать мне правильное направление, я был бы очень признателен.Спасибо!

1 Ответ

1 голос
/ 14 августа 2011

заменить

class ExtendedFlatPage(FlatPage, MPTTModel):

с

class ExtendedFlatPage(MPTTModel, FlatPage):

Это позволит классу MPTTModel переопределять атрибуты и методы FlatPage.

@ комментарий

Похоже, что что-то (атрибут, метод) в модели FlatPage переопределяет что-то в MPTTModel, в котором содержится эта ошибка.

порядок классов, из которых вы импортируете, важен. Вот пример:

class A:
   attribute = 1
class B:
   attribute = 2
class C(A,B):
   pass

класс C attribute значение будет 1.

...