2016-06-24 51 views
0

我正在爲安裝了Zinnia的django項目建立一個主頁,它將顯示每個類別的最新條目。 Here,Fantomas42建議註冊一個採用get_recent_entries標籤並添加過濾器子句的新模板標籤是實現此目的的最佳方式。如何在Zinnia中註冊templatetag以顯示特定類別的最新條目?

我試圖看看其他模板標籤來收集如何通過上下文線索編寫此過濾器子句,但標籤設計爲動態工作,而不是抓取任何具體名稱,所以我無法完全解析如何編寫子句可以篩選特定類別。

我不確定是否最好編寫子句來篩選子彈(在這種情況下,類別的子彈是政治性的),通過字符串的類別名稱(「The Political Beat」 ),或者通過類別樹中的類別位置(這將是位置1,因爲它是目前唯一註冊的類別 - 除非它是0 ...再次,我真的希望我有時間退後一步並採取行動幾個python教程...)。

爲背景,這裏有一些通過百日註冊的其他templatetags的:

@register.inclusion_tag('zinnia/tags/dummy.html', takes_context=True) 
    def get_categories(context, template='zinnia/tags/categories.html'): 
    """ 
    Return the published categories. 
    """ 
    return {'template': template, 
      'categories': Category.published.all().annotate(
       count_entries_published=Count('entries')), 
      'context_category': context.get('category')} 


@register.inclusion_tag('zinnia/tags/dummy.html', takes_context=True) 
def get_categories_tree(context, 
template='zinnia/tags/categories_tree.html'): 
    """ 
    Return the categories as a tree. 
    """ 
    return {'template': template, 
      'categories': Category.objects.all(), 
      'context_category': context.get('category')} 


@register.inclusion_tag('zinnia/tags/dummy.html', takes_context=True) 
def get_authors(context, template='zinnia/tags/authors.html'): 
    """ 
    Return the published authors. 
    """ 
    return {'template': template, 
      'authors': Author.published.all().annotate(
       count_entries_published=Count('entries')), 
      'context_author': context.get('author')} 


@register.inclusion_tag('zinnia/tags/dummy.html') 
def get_recent_entries(number=5, 
template='zinnia/tags/entries_recent.html'): 
    """ 
    Return the most recent entries. 
    """ 
    return {'template': template, 
      'entries': Entry.published.all()[:number]} 



@register.inclusion_tag('zinnia/tags/dummy.html') 
def get_featured_entries(number=5, 
         template='zinnia/tags/entries_featured.html'): 
    """ 
    Return the featured entries. 
    """ 
    return {'template': template, 
      'entries': Entry.published.filter(featured=True)[:number]} 


@register.inclusion_tag('zinnia/tags/dummy.html') 
def get_draft_entries(number=5, 
         template='zinnia/tags/entries_draft.html'): 
    """ 
    Return the last draft entries. 
    """ 
    return {'template': template, 
      'entries': Entry.objects.filter(status=DRAFT)[:number]} 

我是那種盲目與解決方案進行試驗的,但如果我碰巧在它絆倒,我會更新一個答案!

編輯:這裏是我與百日草一體化的家庭模板的照片,以防萬一它有助於澄清創建新的模板標籤的目標。 Photo of homepage.

回答

0

這是不是最漂亮的解決方案(主要是因爲你必須在兩個地方,選擇您的類別,如果你想保持以您的Sitemap),但它確實允許您根據獲得最新條目的各自的類別,我想分享它,以防其他人在Python中缺乏徹底的專業知識正在尋求實現這一功能。

而且,如果你精通了蟒蛇,也許這個解決方案將讓你心煩意亂足夠發佈一個更好的:)

從上下文線索,我可以收集來自百日的其他templatetags,我推斷,如果「特色=真正的「由」精選「條目過濾,那麼也許我可以在管理員中擴展入口模型,以包含其他類型的」精選「複選框,這將與發佈的條目的類別相對應。在這種情況下,我添加了「Featured_politics」。

然後我修改了以下文件(實際上,我搜索「精選」整個項目,並複製/粘貼相應的代碼,改「精選」到「featured_politics」):

百日草/admin/entry.py

class EntryAdmin(admin.ModelAdmin): 
    """ 
    Admin for Entry model. 
    """ 
    form = EntryAdminForm 
    date_hierarchy = 'publication_date' 
    fieldsets = (
     (_('Content'), { 
     'fields': (('title', 'status'), 'lead', 'content',)}), 
     (_('Illustration'), { 
      'fields': ('image', 'image_caption'), 
      'classes': ('collapse', 'collapse-closed')}), 
     (_('Publication'), { 
      'fields': ('publication_date', 'sites', 
         ('start_publication', 'end_publication')), 
      'classes': ('collapse', 'collapse-closed')}), 
     (_('Discussions'), { 
      'fields': ('comment_enabled', 'pingback_enabled', 
         'trackback_enabled'), 
      'classes': ('collapse', 'collapse-closed')}), 
     (_('Privacy'), { 
      'fields': ('login_required', 'password'), 
      'classes': ('collapse', 'collapse-closed')}), 
     (_('Templates'), { 
      'fields': ('content_template', 'detail_template'), 
      'classes': ('collapse', 'collapse-closed')}), 
     (_('Metadatas'), { 
      'fields': ('featured', 'featured_politics', 'excerpt', 'authors', 'related'), 
      'classes': ('collapse', 'collapse-closed')}), 
     (None, {'fields': ('categories', 'tags', 'slug')})) 
    list_filter = (CategoryListFilter, AuthorListFilter, 
        'publication_date', 'sites', 'status') 
    list_display = ('get_title', 'get_authors', 'get_categories', 
        'get_tags', 'get_sites', 'get_is_visible', 'featured', 
        'get_short_url', 'publication_date') 
    radio_fields = {'content_template': admin.VERTICAL, 
        'detail_template': admin.VERTICAL} 
    filter_horizontal = ('categories', 'authors', 'related') 
    prepopulated_fields = {'slug': ('title',)} 
    search_fields = ('title', 'excerpt', 'content', 'tags') 
    actions = ['make_mine', 'make_published', 'make_hidden', 
       'close_comments', 'close_pingbacks', 'close_trackbacks', 
       'ping_directories', 'put_on_top', 
       'mark_featured', 'mark_featured_poltics', 'unmark_featured_poltics', 'unmark_featured'] 



def mark_featured_politics(self, request, queryset): 
     """ 
     Mark selected as featured post. 
     """ 
     queryset.update(featured_politics=True) 
     self.message_user(
      request, _('Selected entries are now marked as featured in politics.')) 
    mark_featured_politics.short_description = _('Mark selected entries as featured in politics.') 

    def unmark_featured(self, request, queryset): 
     """ 
     Un-Mark selected featured posts. 
     """ 
     queryset.update(featured=False) 
     self.message_user(
      request, _('Selected entries are no longer marked as featured.')) 
    unmark_featured.short_description = _(
     'Unmark selected entries as featured') 

    def unmark_featured_politics(self, request, queryset): 
     """ 
     Un-Mark selected featured posts. 
     """ 
     queryset.update(featured_politics=False) 
     self.message_user(
      request, _('Selected entries are no longer marked as featured in politics.')) 
    unmark_featured_politics.short_description = _(
    'Unmark selected entries as featured in politics.') 

百日草/夾具/ helloworld.json(不知道這是必要的,但是這是一個摘錄幾個 - 看起來完全相同的 - 改變我在這裏製作)。

 "featured": false, 
     "featured_politics": false, 
     "start_publication": null, 
     "pingback_enabled": true, 
     "trackback_enabled": true, 
     "authors": [ 

zinnia/models_bases/entry。PY

class FeaturedEntry(models.Model): 
    """ 
    Abstract model class to mark entries as featured. 
    """ 
    featured = models.BooleanField(
     _('featured'), default=False) 

    class Meta: 
     abstract = True 

class FeaturedEntryPolitics(models.Model): 
    """ 
    Abstract model class to mark entries as featured. 
    """ 
    featured_politics = models.BooleanField(
     _('featured_politics'), default=False) 

    class Meta: 
     abstract = True 

而且,在models_bases/entry.py的底部,更新這個列表中包含的新類(ES):

class AbstractEntry(
     CoreEntry, 
     ContentEntry, 
     DiscussionsEntry, 
     RelatedEntry, 
     LeadEntry, 
     ExcerptEntry, 
     ImageEntry, 
     FeaturedEntry, 
     FeaturedEntryPolitics, 
     AuthorsEntry, 
     CategoriesEntry, 
     TagsEntry, 
     LoginRequiredEntry, 
     PasswordRequiredEntry, 
     ContentTemplateEntry, 
     DetailTemplateEntry): 

百日草/ templatetags/zinnia.py

@register.inclusion_tag('zinnia/tags/dummy.html') 
def get_featured_entries(number=5, 
         template='zinnia/tags/entries_featured.html'): 
    """ 
    Return the featured entries. 
    """ 
    return {'template': template, 
      'entries': Entry.published.filter(featured=True)[:number]} 

@register.inclusion_tag('zinnia/tags/dummy.html') 
def get_politics_entries(number=5, 
         template='recent_politics.html'): 
    """ 
    Return the featured entries. 
    """ 
    return {'template': template, 
      'entries': Entry.published.filter(featured_politics=True)[:number]} 

百日草/ XMLRPC/metaweblog.py

# Useful Wordpress Extensions 
      'wp_author': author.get_username(), 
      'wp_author_id': author.pk, 
      'wp_author_display_name': author.__str__(), 
      'wp_password': entry.password, 
      'wp_slug': entry.slug, 
      'sticky': entry.featured, 
      'sticky': entry.featured_politics} 


@xmlrpc_func(returns='struct[]', args=['string', 'string', 'string']) 
def get_users_blogs(apikey, username, password): 
    """ 
    blogger.getUsersBlogs(api_key, username, password) 
    => blog structure[] 
    """ 
    authenticate(username, password) 
    site = Site.objects.get_current() 
    return [blog_structure(site)] 


@xmlrpc_func(returns='struct', args=['string', 'string', 'string']) 
def get_user_info(apikey, username, password): 
    """ 
    blogger.getUserInfo(api_key, username, password) 
    => user structure 
    """ 
    user = authenticate(username, password) 
    site = Site.objects.get_current() 
    return user_structure(user, site) 


@xmlrpc_func(returns='struct[]', args=['string', 'string', 'string']) 
def get_authors(apikey, username, password): 
    """ 
    wp.getAuthors(api_key, username, password) 
    => author structure[] 
    """ 
    authenticate(username, password) 
    return [author_structure(author) 
      for author in Author.objects.filter(is_staff=True)] 


@xmlrpc_func(returns='boolean', args=['string', 'string', 
             'string', 'string', 'string']) 
def delete_post(apikey, post_id, username, password, publish): 
    """ 
    blogger.deletePost(api_key, post_id, username, password, 'publish') 
    => boolean 
    """ 
    user = authenticate(username, password, 'zinnia.delete_entry') 
    entry = Entry.objects.get(id=post_id, authors=user) 
    entry.delete() 
    return True 


@xmlrpc_func(returns='struct', args=['string', 'string', 'string']) 
def get_post(post_id, username, password): 
    """ 
    metaWeblog.getPost(post_id, username, password) 
    => post structure 
    """ 
    user = authenticate(username, password) 
    site = Site.objects.get_current() 
    return post_structure(Entry.objects.get(id=post_id, authors=user), site) 


@xmlrpc_func(returns='struct[]', 
      args=['string', 'string', 'string', 'integer']) 
def get_recent_posts(blog_id, username, password, number): 
    """ 
    metaWeblog.getRecentPosts(blog_id, username, password, number) 
    => post structure[] 
    """ 
    user = authenticate(username, password) 
    site = Site.objects.get_current() 
    return [post_structure(entry, site) 
      for entry in Entry.objects.filter(authors=user)[:number]] 


@xmlrpc_func(returns='struct[]', args=['string', 'string', 'string']) 
def get_tags(blog_id, username, password): 
    """ 
    wp.getTags(blog_id, username, password) 
    => tag structure[] 
    """ 
    authenticate(username, password) 
    site = Site.objects.get_current() 
    return [tag_structure(tag, site) 
      for tag in Tag.objects.usage_for_queryset(
       Entry.published.all(), counts=True)] 


@xmlrpc_func(returns='struct[]', args=['string', 'string', 'string']) 
def get_categories(blog_id, username, password): 
    """ 
    metaWeblog.getCategories(blog_id, username, password) 
    => category structure[] 
    """ 
    authenticate(username, password) 
    site = Site.objects.get_current() 
    return [category_structure(category, site) 
      for category in Category.objects.all()] 


@xmlrpc_func(returns='string', args=['string', 'string', 'string', 'struct']) 
def new_category(blog_id, username, password, category_struct): 
    """ 
    wp.newCategory(blog_id, username, password, category) 
    => category_id 
    """ 
    authenticate(username, password, 'zinnia.add_category') 
    category_dict = {'title': category_struct['name'], 
        'description': category_struct['description'], 
        'slug': category_struct['slug']} 
    if int(category_struct['parent_id']): 
     category_dict['parent'] = Category.objects.get(
      pk=category_struct['parent_id']) 
    category = Category.objects.create(**category_dict) 

    return category.pk 


@xmlrpc_func(returns='string', args=['string', 'string', 'string', 
           'struct', 'boolean']) 
def new_post(blog_id, username, password, post, publish): 
    """ 
    metaWeblog.newPost(blog_id, username, password, post, publish) 
    => post_id 
    """ 
    user = authenticate(username, password, 'zinnia.add_entry') 
    if post.get('dateCreated'): 
     creation_date = datetime.strptime(
      post['dateCreated'].value[:18], '%Y-%m-%dT%H:%M:%S') 
     if settings.USE_TZ: 
      creation_date = timezone.make_aware(
       creation_date, timezone.utc) 
    else: 
     creation_date = timezone.now() 

    entry_dict = {'title': post['title'], 
        'content': post['description'], 
        'excerpt': post.get('mt_excerpt', ''), 
        'publication_date': creation_date, 
        'creation_date': creation_date, 
        'last_update': creation_date, 
        'comment_enabled': post.get('mt_allow_comments', 1) == 1, 
        'pingback_enabled': post.get('mt_allow_pings', 1) == 1, 
        'trackback_enabled': post.get('mt_allow_pings', 1) == 1, 
        'featured': post.get('sticky', 0) == 1, 
        'featured_politics': post.get('sticky', 0) == 1, 
        'tags': 'mt_keywords' in post and post['mt_keywords'] or '', 
        'slug': 'wp_slug' in post and post['wp_slug'] or slugify(
         post['title']), 
        'password': post.get('wp_password', '')} 
    if user.has_perm('zinnia.can_change_status'): 
     entry_dict['status'] = publish and PUBLISHED or DRAFT 

    entry = Entry.objects.create(**entry_dict) 

    author = user 
    if 'wp_author_id' in post and user.has_perm('zinnia.can_change_author'): 
     if int(post['wp_author_id']) != user.pk: 
      author = Author.objects.get(pk=post['wp_author_id']) 
    entry.authors.add(author) 

    entry.sites.add(Site.objects.get_current()) 
    if 'categories' in post: 
     entry.categories.add(*[ 
      Category.objects.get_or_create(
       title=cat, slug=slugify(cat))[0] 
      for cat in post['categories']]) 

    return entry.pk 


@xmlrpc_func(returns='boolean', args=['string', 'string', 'string', 
             'struct', 'boolean']) 
def edit_post(post_id, username, password, post, publish): 
    """ 
    metaWeblog.editPost(post_id, username, password, post, publish) 
    => boolean 
    """ 
    user = authenticate(username, password, 'zinnia.change_entry') 
    entry = Entry.objects.get(id=post_id, authors=user) 
    if post.get('dateCreated'): 
     creation_date = datetime.strptime(
      post['dateCreated'].value[:18], '%Y-%m-%dT%H:%M:%S') 
     if settings.USE_TZ: 
      creation_date = timezone.make_aware(
       creation_date, timezone.utc) 
    else: 
     creation_date = entry.creation_date 

    entry.title = post['title'] 
    entry.content = post['description'] 
    entry.excerpt = post.get('mt_excerpt', '') 
    entry.publication_date = creation_date 
    entry.creation_date = creation_date 
    entry.last_update = timezone.now() 
    entry.comment_enabled = post.get('mt_allow_comments', 1) == 1 
    entry.pingback_enabled = post.get('mt_allow_pings', 1) == 1 
    entry.trackback_enabled = post.get('mt_allow_pings', 1) == 1 
    entry.featured = post.get('sticky', 0) == 1 
    entry.featured_politics = post.get('sticky', 0) == 1 

不要忘記,您已經對模型進行了更改,因此您需要運行遷移!

現在,我可以通過使用{% get_politics_entries 3 template="homepage_latest_politics.html" %},在主頁上的「政治」標題下面顯示我想要顯示的最新條目。

不完全相關,但以防萬一它是有幫助的人,我對homepage_latest_politics.html模板是:

{% load i18n %} 
<div class="row {% if not entries %}no-{% endif %}entries-featured_poltics"> 
    {% for entry in entries %} 
     <div class="col s4"> 
      <div class="card large"> 
      <div class="card-image"> 
       <img src="{% if entry.image %}{{ entry.image.url }}{% endif %}" alt="{{ entry.title }}"> 
       <span class="card-title">{{ entry.title }}</span> 
      </div> 
      <div class="card-content"> 
       <p>{{ entry.excerpt|safe|linebreaks|truncatewords_html:30 }}</p> 
      </div> 
      <div class="card-action"> 
       <a href="#">Click to read more.</a> 
      </div> 
      </div> 
     </div> 
     {% endfor %} 
</div> 

這是百日草的標籤與Materialise公司的「一卡通」組件的集成,併產生這一點 - 與條目是最新的有 「Featured_politics」 框中選中:

enter image description here

enter image description here

嘿 - 我確實說這不是最漂亮的解決方案,但是...它的工作原理!

相關問題