'str'对象没有属性'get_ordering_field_columns'django错误

时间:2012-07-05 01:56:53

标签: python django templates view

我已经搜索了一段时间试图解决这个问题。我是一个蟒蛇新手,所以如果这是一个愚蠢的问题我提前道歉。

我正在尝试使用线程(不是pthread类型线程,而是注释线程)实现人员间消息系统。我从软件设计的角度理解如何制作这样的系统,但我不知道标题中的错误是什么意思或如何解决它。我已经设法通过谷歌和stackoverflow修复了我的所有其他错误,但这仍然是一个谜。

urls.py

urlpatterns = patterns('',
# Examples:
url(r'^home/bam$', 'fblmanager.views.home.bam', name='bam'),
url(r'^admin/comments/commenttitle/$', 'comments.admin_views.comments', name='comments'),
# url(r'^emailinterface/', include('emailinterface.foo.urls')),
# Uncomment the admin/doc line below to enable admin documentation:
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
(r'^grappelli/', include('grappelli.urls')),)

admin_views.py

    from comments.models import *
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.contrib.admin.views.decorators import staff_member_required

def comments(request):
    return render_to_response(
        'comment_list.html',
    )

评论/ models.py

from django.db import models
from django.contrib import admin
from django.contrib.auth.models import User
from django import template

class CommentMessage(models.Model):
    id = models.AutoField(primary_key = True)
    comment = models.TextField('Comment')
    add_timestamp = models.DateTimeField('Date Added', auto_now = True, auto_now_add = False)
    update_timestamp = models.DateTimeField('Date Of Last Update', auto_now = True, auto_now_add = True)
    user = models.ForeignKey(User)

    def __unicode__(self):
        return '%s' % (self.comment)

    class Meta:
        app_label = 'comments'

class CommentTitle(models.Model):
    id = models.AutoField(primary_key = True)
    title = models.CharField('Comment Title', max_length = 254)
    comment_message = models.ManyToManyField(CommentMessage)
    add_timestamp = models.DateTimeField('Date Added', auto_now = True, auto_now_add = False)
    update_timestamp = models.DateTimeField('Date Of Last Update', auto_now = True, auto_now_add = True)
    user = models.ForeignKey(User)

    def __unicode__(self):
        return '%s' % (self.title)

    class Meta:
        app_label = 'comments'

class CommentTitleAdmin(admin.ModelAdmin):
    register = template.Library()

    def changelist_view(self, request, extra_context = None):
        return super(CommentTitleAdmin, self).changelist_view(request, extra_context)

    @register.inclusion_tag("admin/change_list_results.html")
    def result_list(cl):
        #Displays the headers and data list
        return {'cl' : cl,
                'result_hidden_fields' : list(result_hidden_fields(cl)),
                'result_headers' : list(result_headers(cl)),
                'results' : list(results(cl))}

    #return_list = register.inclusion_tag("admin/change_list_results.html")(result_list)
    list_display = ('title', )

    class Meta:
        app_label = 'comments'

comment_list.html /

{% extends "admin/change_list.html" %}

编辑:

希望这会有所帮助。如果您需要更多信息,我会发布。有很多东西,并且是一个蟒蛇新手我不确定什么是相关的,什么不回答这个问题。我应该把这个包括在内,但不便之处是抱歉。

我猜这个错误是由于我没有做一些我想在CommentTitle方法或CommentTitleAdmin方法中做的事情。

admin.py

from django.contrib import admin
from comments.models import *

admin.site.register(CommentTitle, CommentTitleAdmin)
admin.site.register(CommentMessage)

错误

    Error during template rendering

In template /usr/local/lib/python2.6/dist-packages/django_grappelli-2.4.0a1-py2.6.egg/grappelli/templates/admin/change_list.html, error at line 215

来自change_list.html文件(https://github.com/sehmaschine/django-grappelli/blob/grappelli_2_4/grappelli/templates/admin/change_list.html)

    {% block result_list %}
        {% result_list cl %} # throws the error
    {% endblock %}

编辑2:

我拿出了grappelli应用程序,看看它是否有所作为,我得到了一个不同的错误。

NoReverseMatch at /admin/comments/commenttitle/
Reverse for 'app_list' with arguments '()' and keyword arguments '{'app_label': ''}' not found.

Error during template rendering

In template /usr/local/lib/python2.6/dist-packages/django/contrib/admin/templates/admin/change_list.html, error at line 44

&rsaquo; <a href="{% url 'admin:app_list' app_label=cl.opts.app_label %}">{{ app_label|capfirst|escape }}</a>

解决方案:

我想在视图{%block content%} {%endblock%}是必需的。出于某种原因,我认为它至少会通过使用extends来加载默认视图。

这不是正确的解决方案,尽管它确实让它渲染。即使我当时没有意识到它,它也无法正确渲染。解决方案的部分非常冗长,因为我希望它可以节省其他人我试图找出问题的时间。

正确的解决方案是创建一个覆盖changelist_view方法的类,然后让admin模型继承该类。 changelist_view方法基本上是原始changelist_view方法的复制和粘贴。

删除urls.py文件中的模式,使其看起来像

urlpatterns = patterns('',
# Examples:
url(r'^home/bam$', 'fblmanager.views.home.bam', name='bam'),
url(r'^admin/comments/commenttitle/$', 'comments.admin_views.comments', name='comments'),
# url(r'^emailinterface/', include('emailinterface.foo.urls')),
# Uncomment the admin/doc line below to enable admin documentation:
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
(r'^grappelli/', include('grappelli.urls')),)

看起来像

urlpatterns = patterns('',
# Examples:
url(r'^home/bam$', 'fblmanager.views.home.bam', name='bam'),
# url(r'^emailinterface/', include('emailinterface.foo.urls')),
# Uncomment the admin/doc line below to enable admin documentation:
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
(r'^grappelli/', include('grappelli.urls')),)

然后在models.py文件中

class CommentTitleChangeView(admin.ModelAdmin):
def changelist_view(self, request, extra_context=None):
    """
    The 'change list' admin view for this model.
    """
    from django.contrib.admin.views.main import ERROR_FLAG
    opts = self.model._meta
    app_label = opts.app_label
    if not self.has_change_permission(request, None):
        raise PermissionDenied

    list_display = self.get_list_display(request)
    list_display_links = self.get_list_display_links(request, list_display)

    # Check actions to see if any are available on this changelist
    actions = self.get_actions(request)
    if actions:
        # Add the action checkboxes if there are any actions available.
        list_display = ['action_checkbox'] +  list(list_display)

    ChangeList = self.get_changelist(request)
    try:
        cl = ChangeList(request, self.model, list_display,
            list_display_links, self.list_filter, self.date_hierarchy,
            self.search_fields, self.list_select_related,
            self.list_per_page, self.list_max_show_all, self.list_editable,
            self)
    except IncorrectLookupParameters:
        # Wacky lookup parameters were given, so redirect to the main
        # changelist page, without parameters, and pass an 'invalid=1'
        # parameter via the query string. If wacky parameters were given
        # and the 'invalid=1' parameter was already in the query string,
        # something is screwed up with the database, so display an error
        # page.
        if ERROR_FLAG in request.GET.keys():
            return SimpleTemplateResponse('admin/invalid_setup.html', {
                'title': _('Database error'),
            })
        return HttpResponseRedirect(request.path + '?' + ERROR_FLAG + '=1')

    # If the request was POSTed, this might be a bulk action or a bulk
    # edit. Try to look up an action or confirmation first, but if this
    # isn't an action the POST will fall through to the bulk edit check,
    # below.
    action_failed = False
    selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME)

    # Actions with no confirmation
    if (actions and request.method == 'POST' and
            'index' in request.POST and '_save' not in request.POST):
        if selected:
            response = self.response_action(request, queryset=cl.get_query_set(request))
            if response:
                return response
            else:
                action_failed = True
        else:
            msg = _("Items must be selected in order to perform "
                    "actions on them. No items have been changed.")
            self.message_user(request, msg)
            action_failed = True

    # Actions with confirmation
    if (actions and request.method == 'POST' and
            helpers.ACTION_CHECKBOX_NAME in request.POST and
            'index' not in request.POST and '_save' not in request.POST):
        if selected:
            response = self.response_action(request, queryset=cl.get_query_set(request))
            if response:
                return response
            else:
                action_failed = True

    # If we're allowing changelist editing, we need to construct a formset
    # for the changelist given all the fields to be edited. Then we'll
    # use the formset to validate/process POSTed data.
    formset = cl.formset = None

    # Handle POSTed bulk-edit data.
    if (request.method == "POST" and cl.list_editable and
            '_save' in request.POST and not action_failed):
        FormSet = self.get_changelist_formset(request)
        formset = cl.formset = FormSet(request.POST, request.FILES, queryset=cl.result_list)
        if formset.is_valid():
            changecount = 0
            for form in formset.forms:
                if form.has_changed():
                    obj = self.save_form(request, form, change=True)
                    self.save_model(request, obj, form, change=True)
                    self.save_related(request, form, formsets=[], change=True)
                    change_msg = self.construct_change_message(request, form, None)
                    self.log_change(request, obj, change_msg)
                    changecount += 1

            if changecount:
                if changecount == 1:
                    name = force_unicode(opts.verbose_name)
                else:
                    name = force_unicode(opts.verbose_name_plural)
                msg = ungettext("%(count)s %(name)s was changed successfully.",
                                "%(count)s %(name)s were changed successfully.",
                                changecount) % {'count': changecount,
                                                'name': name,
                                                'obj': force_unicode(obj)}
                self.message_user(request, msg)

            return HttpResponseRedirect(request.get_full_path())

    # Handle GET -- construct a formset for display.
    elif cl.list_editable:
        FormSet = self.get_changelist_formset(request)
        formset = cl.formset = FormSet(queryset=cl.result_list)

    # Build the list of media to be used by the formset.
    if formset:
        media = self.media + formset.media
    else:
        media = self.media

    # Build the action form and populate it with available actions.
    if actions:
        action_form = self.action_form(auto_id=None)
        action_form.fields['action'].choices = self.get_action_choices(request)
    else:
        action_form = None

    selection_note_all = ungettext('%(total_count)s selected',
        'All %(total_count)s selected', cl.result_count)

    context = {
        'module_name': force_unicode(opts.verbose_name_plural),
        'selection_note': _('0 of %(cnt)s selected') % {'cnt': len(cl.result_list)},
        'selection_note_all': selection_note_all % {'total_count': cl.result_count},
        'title': cl.title,
        'is_popup': cl.is_popup,
        'cl': cl,
        'media': media,
        'has_add_permission': self.has_add_permission(request),
        'app_label': app_label,
        'action_form': action_form,
        'actions_on_top': self.actions_on_top,
        'actions_on_bottom': self.actions_on_bottom,
        'actions_selection_counter': self.actions_selection_counter,
    }
    context.update(extra_context or {})

    return TemplateResponse(request, [
        'comments/templates/change_list.html',
        '/var/www/laughing-ninja/emailinterface/comments/templates/comment_list.html',
        'admin/%s/change_list.html' % app_label,
        'templates/change_list.html',
        #'admin/change_list.html'
    ], context, current_app=self.admin_site.name)

和管理员方法

class CommentTitleAdmin(CommentTitleChangeView):
list_display = ('title', )

class Meta:
    app_label = 'comments'

0 个答案:

没有答案