通用列表视图引发属性错误:"'function'对象没有属性'_clone'

Chr*_*ris 6 python django

这里有一个奇怪的错误,也许有人可以帮助追踪源代码,因为它试图扩展Django CMS项目并试图使用一些逻辑,作为该项目的一部分,我还不完全清楚.简而言之,使用:

urls.py
======================
from django.conf.urls.defaults import *
from cmsplugin_flat_news.models import News

'''RETURNING _CLONE ERROR WHEN IMPLEMENTED
def get_news():
    return News.published.all()

news_dict = {
    'queryset': get_news,
}

news_list_dic = {
    'queryset': get_news,
    'paginate_by': 50,
}
'''
# NEXT SECTION FUNCTIONS BUT NEEDS SERVER RESTART TO SEE NEW POSTS.
#CHANGING TO JUST News.published.all RAISES SAME ISSUE AS USING WRAPPER
#SOLUTION ABOVE. SEE: http://docs.djangoproject.com/en/dev/topics/db/queries/#caching-and-querysets
#& EXAMPLE HERE: http://docs.djangoproject.com/en/dev/topics/generic-views/#adding-extra-context

news_dict = {
    'queryset': News.published.all(),
}

news_list_dic = {
    'queryset': News.published.all(),#SAME ISSUE
    'paginate_by': 50,
}

urlpatterns = patterns('django.views.generic.list_detail',
    (r'^$', 'object_list', news_list_dic),
    (r'^(?P<page>[0-9]+)/$', 'object_list', dict(news_list_dic)),
    url(r'^(?P<slug>[-\w]+)/$', 'object_detail', news_dict, name='news_view'),
)

models.py
======================
class PublishedNewsManager(models.Manager):
    #Filters out all unpublished news and news with a publication date in the future
    def get_query_set(self):
        return super(PublishedNewsManager, self).get_query_set() \
                    .filter(is_published=True) \
                    .filter(pub_date__lte=datetime.datetime.now())

class News(models.Model):
    title           = models.CharField(_('Title'), max_length=255)
    slug            = models.SlugField(_('Slug'), unique_for_date='pub_date')
    author          = models.ForeignKey(User)
    description     = models.TextField(_('Description'), blank=True)
    image           = generic.GenericRelation('NewsImage', blank=True, null=True)
    content         = models.TextField(_('Content'), blank=True)
    tags            = TagField()
    is_published    = models.BooleanField(_('Published'), default=False)
    pub_date        = models.DateTimeField(_('Publication date'), default=datetime.datetime.now())
    created         = models.DateTimeField(auto_now_add=True, editable=False)
    updated         = models.DateTimeField(auto_now=True, editable=False)
    published       = PublishedNewsManager()
    objects         = models.Manager()
Run Code Online (Sandbox Code Playgroud)

请参阅注释中的问题:基本上,通过实现"正确"解决方案为视图添加额外上下文而引发的错误.错误是Attribute Error: "'function' object has no attribute '_clone'"

尝试:News.published.all而不是News.published.all()引发错误,无论是作为包装函数的一部分使用还是直接在urlpattern的queryset部分中使用.

必须遗漏一些明显的东西?认为它是使用PublishedNewsManager不将对象作为字典返回,或者调整代码以正确地将对象返回到视图.

Jon*_*nan 9

这些_clone错误是由于您将函数作为参数传递给QuerySet期望a的通用视图而导致的红色鲱鱼.传递News.published.all()给通用视图的代码版本是正确的,因为通用视图将尝试克隆它们给出的QuerySet,以避免缓存它们查询的第一批数据(因此传递函数时会出现错误).

您的问题似乎是您的自定义get_query_set方法QuerySet根据调用方法时的当前日期和时间返回过滤.

我在文档中看不到有关filter可调用参数的任何内容,但我确实找到了这个filter可以使用可调用参数的票证,因此请尝试更改您的管理器以传递要调用的函数以获取当前日期/时间,而不是比立即打电话:

class PublishedNewsManager(models.Manager):
    def get_query_set(self):
        return super(PublishedNewsManager, self).get_query_set() \
                    .filter(is_published=True) \
                    .filter(pub_date__lte=datetime.datetime.now)
Run Code Online (Sandbox Code Playgroud)