【问题标题】:DjangoCMS populate the data of the model in multiple custom pluginDjangoCMS 在多个自定义插件中填充模型的数据
【发布时间】:2020-12-14 15:12:20
【问题描述】:

我正在使用 DjangoCMS 进行网站开发。我需要在网站的多个地方使用公司的电话号码和电子邮件。所以我想用下面的模型写一个自定义插件

from cms.models.pluginmodel import CMSPlugin
from django.db import models

# Create your models here.

class ContactDetails(CMSPlugin):
    phone_number = models.CharField(max_length=50,default="000000000")
    email_id = models.CharField(max_length=50,default="Enter the Email")
    address = models.CharField(max_length=200,default="Enter Address")

还有下面的cms_plugins.py

from cms.plugin_pool import plugin_pool
from cms.models.pluginmodel import CMSPlugin
from django.utils.translation import ugettext_lazy as _
from .models import ContactDetails

@plugin_pool.register_plugin
class ContactDetailsPluginFooter(CMSPluginBase):
    model = ContactDetails
    name = _("Contact Plugin Footer")
    render_template = "contact_details_footer.html"
    cache = False

    def render(self, context, instance, placeholder):
        context = super(ContactDetailsPluginFooter, self).render(context,instance, placeholder)
        return context

@plugin_pool.register_plugin
class ContactDetailsPluginHeader(CMSPluginBase):
    model = ContactDetails
    name = _("Contact Plugin Header")
    render_template = "contact_details_header.html"
    cache = False

    def render(self, context, instance, placeholder):
        context = super(ContactDetailsPluginHeader, self).render(context,instance, placeholder)
        return context

我有如下模板。

contact_details_footer.html

<div class="container">
    <div class="row">
        <div class="col-sm-3 col-md-3">
            <div class="f-h-content">
                <h3>Call Us Now !</h3>
                <h2>{{instance.phone_number}}</h2>
                <p><a href="#">24/7 Available</a></p>
            </div>
        </div>
        <div class="col-sm-3 col-md-3">
            <div class="f-h-content">
                <h3>Send Us Message !</h3>
                <h2>{{instance.email_id}}</h2>
                <p><a href="#">24/7 Available</a></p>
            </div>
        </div>
        <div class="col-sm-6 col-md-6">
            <div class="f-h-content">
                <h3>Visit Our Dubai Office !</h3>
                <h2>{{instance.address}} ‬‬‬</h2>
                <p><a href="#">View Map</a></p>
            </div>
        </div>
    </div>
</div>

contact_details_header.html

<div class="header-contact">
                       
    <ul>

        <li><span>Phone :</span> {{instance.phone_number}}</li>
        <li><span>Email :</span> {{instance.email_id}} </li>
        <li><a href="contact-us.html">Free Consultation</a></li>
    </ul>
</div>

但是在这里,当我每次都添加相同的内容时,我必须添加电话和电子邮件 ID 和地址。我应该怎么做才能让它进入一次并使用多个插件。

【问题讨论】:

    标签: plugins content-management-system django-cms


    【解决方案1】:

    您提到的问题是故意的,因为每个插件都是存储在数据库中的唯一模型实例。

    我们可以创建一个独特的插件实例,链接到一个 ContactDetails 实例。为此,我们必须创建外键关系,以便 ContactDetails 实例可以链接到许多插件。

    我们还可以使用 Django 管理内联来启用创建 ContactDetails 并将其附加到插件。

    models.py

    from cms.models.pluginmodel import CMSPlugin
    from django.db import models
    
    
    class ContactDetails(models.Model):
        phone_number = models.CharField(max_length=50,default="000000000")
        email_id = models.CharField(max_length=50,default="Enter the Email")
        address = models.CharField(max_length=200,default="Enter Address")
    
    
    class ContactDetailsPluginModel(CMSPlugin):
    
        unique_to_plugin_field = models.CharField(max_length=150)
    
        contact = models.ForeignKey(
            'Contact', null=True, blank=True, on_delete=models.CASCADE)
    
        def __str__(self):
            return self.unique_to_plugin_field
    
    

    cms_plugins.py

    
    class ContactDetailsInline(admin.StackedInline):
        model = ContactDetails
    
    
    @plugin_pool.register_plugin
    class ContactDetailsPluginHeader(CMSPluginBase):
        model = ContactDetailsPluginModel
        name = _("Contact Plugin Header")
        render_template = "contact_details_header.html"
        cache = False
        inlines = [
            ContactDetails,
        ]
    
        def render(self, context, instance, placeholder):
            context = super(ContactDetailsPluginHeader, self).render(context,instance, placeholder)
            return context
    

    您的模板现在可以使用以下关系访问:instance.contact.email_id

    contact_details_header.html

    <div class="header-contact">            
        <ul>
            <li><span>Phone :</span> {{instance.contact.phone_number}}</li>
            <li><span>Email :</span> {{instance.contact.email_id}} </li>
            <li><a href="contact-us.html">Free Consultation</a></li>
        </ul>
    </div>
    

    【讨论】:

      猜你喜欢
      • 2015-01-23
      • 1970-01-01
      • 2020-12-16
      • 2011-05-24
      • 2015-06-09
      • 2011-12-05
      • 2015-10-04
      • 2011-08-04
      • 1970-01-01
      相关资源
      最近更新 更多