Here's a photo of the home template I'm integrating with Zinnia, in case it's helpful in clarifying the goal of creating the new templatetag(s).推荐答案这不是最漂亮的解决方案(主要是因为如果要保持站点地图的顺序,则必须在两个位置选择类别),但是确实允许您根据各自的类别获取最新条目,如果其他在python方面缺乏专门知识的人希望实现此功能,我想与他人分享.This isn't the prettiest solution (mainly because you have to select your category in two places, if you want to keep your sitemap in order), but it does allow you to get recent entries based on their respective categories, and I want to share it in case somebody else who lacks thorough expertise in python is looking to implement this functionality.而且,如果您精通python,也许此解决方案会让您感到沮丧,足以发布更好的解决方案了:)And, if you are proficient with python, maybe this solution will upset you enough to post a better one :)从我可以从百日菊属的其他templatetags收集的上下文线索中,我推断出,如果"Featured = True"被"Featured"条目过滤掉,那么也许我可以将管理员中的条目模型扩展为包括其他类型的"Featured"复选框,与发布的条目的类别相对应.在这种情况下,我添加了"Featured_politics". From the context clues I could gather from Zinnia's other templatetags, I deduced that if "Featured=True" filtered by "Featured" entries, then maybe I could extend the entry model in the admin to included other types of "Featured" checkboxes, which would correspond with the categories of the entry posted. In this case, I added "Featured_politics." 然后,我对以下文件进行了更改(基本上,我在整个项目中搜索功能",然后复制/粘贴了相应的代码,并将功能"更改为"featured_politics"):I then made changes to the following files (essentially, I searched for "featured" throughout the project, and copy/pasted the corresponding code, and changed "featured" to "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.') zinnia/fixtures/helloworld.json (不确定是否有必要,但这是摘录的几个摘录-看起来完全一样-我在这里所做的更改).zinnia/fixtures/helloworld.json (not sure if this was necessary, but this is one excerpt from several -- that look the exact same -- changes that I made in here). "featured": false, "featured_politics": false, "start_publication": null, "pingback_enabled": true, "trackback_enabled": true, "authors": [ 百日草/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 = Trueclass 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的底部,更新此列表以包括您的新课程:And, at the bottom of models_bases/entry.py, update this list to include your new class(es):class AbstractEntry( CoreEntry, ContentEntry, DiscussionsEntry, RelatedEntry, LeadEntry, ExcerptEntry, ImageEntry, FeaturedEntry, FeaturedEntryPolitics, AuthorsEntry, CategoriesEntry, TagsEntry, LoginRequiredEntry, PasswordRequiredEntry, ContentTemplateEntry, DetailTemplateEntry): zinnia/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]} zinnia/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别忘了您已经对模型进行了更改,因此您需要运行迁移!Don't forget that you've made changes to your models, so you need to run migrations!现在,我可以使用{% get_politics_entries 3 template="homepage_latest_politics.html" %}调用要显示在主页上(在此示例中)"Politics"标题下的最新条目.And now, I can call the latest entries that I want to appear under a (in this example) "Politics" header on the homepage by using {% get_politics_entries 3 template="homepage_latest_politics.html" %}.并不完全相关,但是以防万一,这对我有帮助,我的homepage_latest_politics.html模板是:Not entirely relevant, but just in case it's helpful to anybody, my template for homepage_latest_politics.html is:{% 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>这是百日菊红的标签与Materialize的卡片"组件的集成,并产生了这一点-条目是最新的,其中选中了"Featured_politics"框:This is an integration of zinnia's tags with the "Card" component of Materialize, and produces this -- with the entries being the latest to have the "Featured_politics" box checked: 嘿-我 说这不是最漂亮的解决方案,但是...有效!Hey -- I did say that it wasn't the prettiest solution, but... it works! 这篇关于如何在Zinnia中注册templatetag以显示特定类别的最新条目?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!
10-30 08:22