1

django-mptt を使用して単純なネストされたコメント システムをセットアップしようとしていますが、いくつかの問題が発生しています。誰かが見て、私が間違っていることを教えてくれたら、本当に感謝しています.

これまでのところ、特定の投稿に対するコメントの表示のみを設定しました。作成/更新/削除は当分の間、管理者を通じて行われます。私が抱えている問題の 1 つは、管理者で作成/更新/削除しようとすると、「'NoneType' オブジェクトに属性 'tree_id' がありません」という属性エラーが発生することがあります。もう 1 つは、コメント インスタンスの「order_insertion_by」(「points」フィールド) で指定されたフィールドの整数値を管理者から変更すると、必要なページに移動したときに「cache_tree_children に間違った順序でノードが渡されました」という ValueError が発生する場合があることです。投稿とコメントを表示します。

また、特定のコメントが間違った親の下に表示されることもあり、まったく表示されないこともあります。

私のコメントモデルの関連部分は次のとおりです。

class Comment(MPTTModel):
    posting = models.ForeignKey(Posting)
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children')
    points = models.IntegerField(
        default=0,
    )

    class MPTTMeta:
        order_insertion_by = ['points']

そして、特定の投稿のコメントを表示するために使用しているテンプレートの関連部分:

{% load mptt_tags %}
{% with posting.comment_set.all as comments %}
<ul class="root">
    {% recursetree comments %}
        <li>
            {{ node.message }}
            {% if not node.is_leaf_node %}
                <ul class="children">
                    {{ children }}
                </ul>
            {% endif %}
        </li>
    {% endrecursetree %}
</ul>
{% endwith %}

そして最後に、私の admin.py ファイル全体です。問題の一部は、管理者を通じて変更を加えたことが原因であると思われるためです。

from django.contrib import admin
from django.forms import ModelForm, Textarea
from postings.models import Posting, Comment

class PostingForm(ModelForm):

    class Meta:

        model = Posting
        widgets = {
            'title': Textarea(attrs={'cols': 75, 'rows': 5}),
            'message': Textarea(attrs={'cols': 75, 'rows': 15}),
        }

class CommentForm(ModelForm):

    class Meta:

        model = Comment
        widgets = {
            'message': Textarea(attrs={'cols': 75, 'rows': 15}),
        }

class CommentInline(admin.TabularInline):
    model = Comment
    form = CommentForm

class PostingAdmin(admin.ModelAdmin):
    inlines = [CommentInline]
    list_display = ('title', 'posted', 'variety', 'points', 'user')
    form = PostingForm

admin.site.register(Posting, PostingAdmin)

これについて何か助けてくれてありがとう。

4

1 に答える 1

1

これについては、すばらしいパッケージ作成者である Craig de Stigter の助けを借りました。問題は、特定のコメントのフィールド (「ポイント」)rebuild()を変更した後、モデルのツリーで使用しなかったために発生したようです。order_insertion_by

彼の提案save()に従って、モデルの再構築を含めるようにコメント モデル フォームのメソッドを変更しました。

def save(self, *args, **kwargs):
    Comment.objects.rebuild()
    return super(CommentForm, self).save(*args, **kwargs)
于 2013-08-05T18:40:26.833 に答える