DjangoCMS在多个自定义插件中填充模型的数据

问题描述

我正在使用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,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,placeholder):
        context = super(ContactDetailsPluginHeader,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和地址。我应该怎么做才能使其一次输入并使用多个插件

解决方法

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

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

我们还可以使用Django admin内联来启用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,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>