问题描述
我正在使用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>