Skip to main content
 首页 » 编程设计

python之现有模型的 Django-cms 插件

2025年04月02日33zengkefu

我有一个带有“新闻”应用程序的 Django 项目。 这是模型:

class News(models.Model): 
   title = CharField(max_length=255) 
   content = TextField() 

如何将django-cms添加到这个项目中,以便能够直接在模板中修改新闻?我知道我需要一个基于“新闻”模型的自定义插件,在这里我有两个选择: 1) 我可以在单个插件中描述“新闻”模型的所有字段,但是会有一个窗口可以一次编辑所有字段。

插件,描述所有字段:

class NewsPlugin(CMSPlugin): 
    title = CharField(max_length=255) 
    content = TextField() 
    def __unicode__(self): 
        return self.title 

2)第二个想法是为“新闻”中的每个单独字段编写插件并将它们组合到另一个插件中,但我不知道如何实现它。

新闻标题的单独插件:

class NewsTitle(CMSPlugin): 
    title = CharField(max_length=255) 

新闻内容的独立插件:

class NewsContent(CMSPlugin): 
    content = TextField() 

有什么想法吗?

请您参考如下方法:

您可能想要考虑的是插件的替代品,我发现它非常适合新闻应用程序。

您可以将新闻内容字段更改为 PlaceholderField这将允许您将插件添加到新闻项目,并使用标准模板占位符可用的所有常用选项配置占位符配置。

在我的新闻应用程序中,我有一个相当典型的设置,一个 ListView然后是 DetailView您可以在其中将 CMS 切换到编辑模式并编辑新闻项目的 PlaceholderField 中的插件。 .

你也可以 extend the toolbar提供链接以在模式对话框中添加新的新闻项目,或列出现有的新闻项目;

@toolbar_pool.register 
class LatestNewsToolbar(CMSToolbar): 
 
    def populate(self): 
 
        news_menu = self.toolbar.get_or_create_menu( 
            NEWS_MENU_IDENTIFIER, NEWS_MENU_NAME 
        ) 
        position = news_menu.get_alphabetical_insert_position( 
            _('Latest news'), 
            SubMenu 
        ) 
 
        menu = news_menu.get_or_create_menu( 
            'latest_news_menu', 
            _('Latest News ...'), 
            position=position 
        ) 
        try: 
            menu.add_modal_item( 
                _('Add News Item'), 
                url=admin_reverse('news_latestnews_add') 
            ) 
        except NoReverseMatch: 
            # not in urls 
            pass 
        try: 
            menu.add_modal_item( 
                _('Existing News Items'), 
                url=admin_reverse('news_latestnews_changelist') 
            ) 
        except NoReverseMatch: 
            # not in urls 
            pass 
 
    def post_template_populate(self): 
        pass 
 
    def request_hook(self): 
        pass 

如果你喜欢这种工作方式,我想你会发现它比插件更合适也更强大:)

并查看此 CMS 区域的视频; https://www.youtube.com/watch?time_continue=2670&v=Dj8dhgmzlFM