我已经搜索了一段时间试图解决这个问题。我是一个蟒蛇新手,所以如果这是一个愚蠢的问题我提前道歉。
我正在尝试使用线程(不是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
› <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'