- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Django 1.4 和 django-CMS 2.3。
我有几个带有 apphooks 的应用程序,我希望在 django-CMS 中能够引用一个应用程序的对象。
为了建立可持续的链接,我试图找到一个使用 django-CMS 菜单或通用外键的插件。
如果不存在这样的东西,那么最好的通用外键应用程序是什么?我刚刚使用 django.contrib.contenttypes 制作了一个小插件,它将选择限制为具有 get_absolute_url
方法的模型,但这太糟糕了。
谢谢。
最佳答案
我刚刚遇到你的问题。我最近为几个项目实现了类似的东西,这是我根据此处描述的 Adam Alton 的工作所做的:http://adamalton.co.uk/blog/displaying-django-genericforeignkey-as-single-form-field/
这
不是 CMSPlugin,但是,所以,我知道这并不能直接回答问题,但它是我所拥有的,我希望它可以帮助其他人寻找类似的解决方案。
作为概述,我在我的模型中定义了一个“横幅”类型,它代表我客户网站首页上的横幅。每个横幅都可以链接到其他内容。在这些情况下,链接目标可以是 Django-CMS 页面,或许多其他类型之一。所有方法都定义了 get_absolute_url 方法,尽管我没有使用内省(introspection)来确定这一点,我只是在此处出现的所有类型上实现了 get_absolute_url 。无论如何,这里是:
首先,这是横幅广告的简单模型:
class Banner(models.Model):
short_name = models.CharField(max_length=64, unique=True)
html = models.TextField()
link_text = models.CharField(max_length=128, default='Learn more')
destination_type = models.ForeignKey(ContentType, null=True, blank=True,
limit_choices_to={"model__in": ("Page", "Project", "Person", "Client")}
)
destination_id = models.PositiveIntegerField(null=True, blank=True)
destination = generic.GenericForeignKey('destination_type', 'destination_id')
published = models.BooleanField(blank=True, default=False)
def __unicode__(self):
return self.short_name
这是我的forms.py:
import re
from django.forms import ModelForm, ChoiceField
from cms.models import Page
from django.contrib.contenttypes.models import ContentType
from apps.your_application.models import Project, Person, Client
class BannerAdminForm(ModelForm):
class Meta:
model = Banner
fields = ("short_name", "html", "link_text", "destination", "link_hash", "published",)
# GenericForeignKey form field, will hold combined object_type and object_id
destination = ChoiceField(required=False) # Note the 'required=False' here.
def __init__(self, *args, **kwargs):
super(BannerAdminForm, self).__init__(*args, **kwargs)
# Combine object_type and object_id into a single 'destination' field
# Get all the objects that we want the user to be able to choose from
# Note: The user is going to locate these by name, so we should
# alphabetize all of these
available_objects = list(Page.objects.all().order_by('title_set__title'))
available_objects += list(Project.objects.all().order_by('title'))
available_objects += list(Person.objects.all().order_by('name'))
available_objects += list(Client.objects.all().order_by('name'))
# Now create our list of choices for the <select> field
object_choices = []
object_choices.append(["", "--"])
for obj in available_objects:
type_class = ContentType.objects.get_for_model(obj.__class__)
type_id = type_class.id
obj_id = obj.id
form_value = "type:%s-id:%s" % (type_id, obj_id) # e.g."type:12-id:3"
display_text = "%s : %s" % (str(type_class), str(obj)) # E.g. "Client : Apple, Inc."
object_choices.append([form_value, display_text])
self.fields['destination'].choices = object_choices
# If there is an existing value, pre-select it
if self.instance.destination:
type_class = ContentType.objects.get_for_model(self.instance.destination.__class__)
type_id = type_class.id
obj_id = self.instance.destination.id
current_value = "type:%s-id:%s" % (type_id, obj_id)
self.fields['destination'].initial = current_value
def save(self, *args, **kwargs):
try:
#get object_type and object_id values from combined destination field
object_string = self.cleaned_data['destination']
matches = re.match("type:(\d+)-id:(\d+)", object_string).groups()
object_type_id = matches[0] # get 45 from "type:45-id:38"
object_id = matches[1] # get 38 from "type:45-id:38"
object_type = ContentType.objects.get(id=object_type_id)
self.cleaned_data['destination_type'] = object_type_id
self.cleaned_data['destination_id'] = object_id
self.instance.destination_id = object_id
self.instance.destination_type = object_type
except:
# If anything goes wrong, leave it blank,
# This is also the case for when '--' is chosen
# In the drop-down (tsk, tsk, bad code style =/)
self.cleaned_data['destination_type'] = None
self.cleaned_data['destination_id'] = None
self.instance.destination_id = None
self.instance.destination_type = None
return super(BannerAdminForm, self).save(*args, **kwargs)
然后您可以通过调用获取目标对象的 URL {% if banner.destination %}{{ banner.destination.get_absolute_url }}{% endif %}
在你的模板中。
工作良好,在 CMSPlugin 中使用应该不会太难。
编辑:实际上,我刚刚实现了与 CMSPlugin 表单完全相同的东西。存在本质上的零差异。请记住将表单添加到 cms_plugins.py 文件中的插件类,如下所示:
class CMSBannerPlugin(CMSPluginBase):
form = BannerAdminForm # <==== Don't forget this part
model = Banner
name = _("Banner Plugin")
render_template = "apps/your_application/_banner.html"
def render(self, context, instance, placeholder):
...
return context
plugin_pool.register_plugin(CMSBannerPlugin)
关于django-cms - 是否有 django-CMS 插件可以链接到具有 URL 的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11810862/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!