将自定义占位符添加到 django-cms

Posted

技术标签:

【中文标题】将自定义占位符添加到 django-cms【英文标题】:Adding a custom placeholder to django-cms 【发布时间】:2014-12-10 17:28:28 【问题描述】:

我正在尝试创建自定义占位符以在网站上添加管理员可编辑的部分。 Django-cms' documentation 非常笼统地说明了添加它需要做什么。

占位符位于一个单独的应用程序中,名为 contacts,已添加到 settings.py 文件中

这是我到目前为止的代码(跳过导入以减少冗长):

models.py

class ContactsPlaceholder(models.Model):
    phone = models.CharField(max_length=100)
    email = models.CharField(max_length=100)
    address = models.TextField(max_length=700)
    # your fields
    my_placeholder = PlaceholderField('contacts_contactsplaceholder')
    # your methods

    def __unicode__(self):
        return "Contacts Placeholder"

views.py

def contacts(request):
  # Load the the contacts from db
  contactsfields = ContactsField.objects.all()
  contacts_placeholder = ContactsPlaceholder.objects.all() 
  context = "contactsfields" : contactsfields, "contacts_placeholder" : contacts_placeholder
  return render(request, "../templates/contacts.html", context) 

def contacts_placeholder_detail(request, id): # is this really useful?
  object = get_object_or_404(ContactsPlaceholder, id=id)
  return render_to_response('../templates/contacts_placeholder_detail.html', 
      'object': object,
  , context_instance=RequestContext(request))

contacts.html

% extends "base.html" %
% load cms_tags %
% block content %
<div>
  <h1>Contacts</h1>

  % placeholder "contacts_placeholder" or %
   <p>Placeholder is empty</p>
  % endplaceholder %
</div>
% endblock content %

最后,admin.py

class ContactsPlaceholderAdmin(PlaceholderAdminMixin, admin.ModelAdmin):
    # Editable fields
    frontend_editable_fields = ("phone", "email", "address")
    # Form fields order and sections
    fieldsets = [
        (None,"fields" : ["phone", "email", "address"])
    ]

admin.site.register(ContactsPlaceholder, ContactsPlaceholderAdmin)

使用此配置,运行后

python manage.py syncdb
我确实在 html 响应中得到“占位符为空”,当然占位符不能使用标准前端编辑器进行编辑,这是所需的行为。

转到 127.0.0.1:8000/admin/ 我可以看到“联系人占位符”表,但是当我单击它或尝试添加项目时,我确实收到以下错误:

OperationalError at /us/admin/contacts/contactsplaceholder/
no such column: contacts_contactsplaceholder.phone

【问题讨论】:

你在运行syncdb后添加了电话栏吗? @Paulo 我尝试运行syncdb,没有任何改变.. 这就是我的意思,一旦你第一次运行 syncdb,django 就不会更新你的表。您必须手动或向南进行 @Paulo 这样做我现在终于可以在 /admin 上打开“联系人占位符”表,但即使我从那里添加一个条目,访问联系人页面时它仍然会显示“占位符为空” .我怀疑views.py中的代码现在是问题吗? 如果我正确理解您的问题.. 使用模板标签:来自 cms_tags 的 render_placeholder。 % render_placeholder object.my_placeholder % 【参考方案1】:

如果contacts() 视图是通过应用挂钩呈现的,那么在模板中使用% placeholder "contacts_placeholder" % 将不起作用。

在通过 AppHook 连接到 CMS 的应用中使用占位符时,您必须使用 % static_placeholder "MyPlaceholder" % 而不是通常的 % Placeholder "MyPlaceholder" %

如果您有一个应用程序或插件,您在其中创建了一个 PlaceholderField,那么在您呈现它的模板中,您需要以下标记;

% render_placeholder instance.placeholderfieldname %

【讨论】:

以上是关于将自定义占位符添加到 django-cms的主要内容,如果未能解决你的问题,请参考以下文章

Django-cms Placeholderfield 不工作,抛出 lambda 异常

Drupal,Ubercart - 将自定义字段添加到结帐表单

在不同的占位符/模板上以不同的方式呈现 Django-CMS 插件

django cms 占位符不在结构视图中

如何在 Next.js 中添加自定义图像占位符?

Django-CMS - 全球占位符?