无痛链接处理-无论是自定义模型、文件或CMS页面
LinkIt的Python项目详细描述
链接
linkit为您提供了一个新的字段类型LinkField
,可以在模型上使用,它允许您轻松地链接到站点上的不同模型。这可能是一个django cms页面模型,
文件管理器文件或任何自定义的,如新闻模型。
安装
用pip安装最新版本,并将linkit
添加到您的INSTALLED_APPS
中,您就可以开始了。
$ pip install LinkIt
用法
您现在可以在任何型号上使用新的LinkField
:
fromdjango.db.modelsimportModel,CharFieldfromlinkit.model_fieldsimportLinkFieldclassFoo(Model):title=CharField(max_length=255)link=LinkField(types=['page','file','input'])# <-- Yay!
如果您在django admin中注册这个模型,您将得到一个下拉字段,YRU可以在其中选择CMS页面、文件管理器文件或只是一个简单的输入字段。 您的模型现在可以用一个字段链接到这些实体中的任何一个。
在模板中,您可以使用如下链接字段:
<ahref="{{ instance.link.href }}"target="{{ instance.link.target }}">{{ instance.link.label }}</a>
配置
LinkField
接受一些选项,这些选项将定义呈现的小部件的外观以及内容编辑器有哪些选项:
types: list = None
定义允许的链接类型(请参阅«类型»一节中的更多内容)allow_target: bool = False
如果设置为true,小部件将呈现一个复选框,以便编辑器可以选择链接的_target
allow_label: bool = True
呈现附加的输入字段,以便可以设置自定义标签allow_no_follow: bool = False
如果设置为true,小部件将呈现一个复选框,以便编辑器可以为链接选择rel="nofollow"
类型
开箱即用的链接有三种类型:输入、文件、页面。LinkType
基类使得实现自己的链接类型变得很容易,无论
可能是的。如果您想链接到应用程序中的另一个现有模型,例如新闻,那么您需要做的就是注册一个新的链接类型。
- 在任何应用程序中创建文件
link_types.py
:
fromlinkit.types.modelimportModelLinkTypeclassNewsLinkType(ModelLinkType):identifier='news'type_label='News'model=News
- 注册新类型,最好在
AppConfig
ready
方法中:
fromdjango.appsimportAppConfigfromdjango.utils.translationimportugettext_lazyas_classContentConfig(AppConfig):name='contents'defready(self):fromcontents.link_typesimportNewsLinkTypefromlinkit.typesimporttype_manageraslinkit_managerlinkit_manager.register(NewsLinkType)
- 利润!现在,您可以在任何模型上创建这样的字段:
link = LinkField(types=['news', 'page])
,并链接到任何新闻或cms页面。
检查linkit/types
以查看如何实现核心类型。
电子邮件类型示例
假设我们有一个完全不同的新类型想要实现,并且不能仅仅从ModelLinkType
扩展。参见下面的示例
用于链接到具有可选主题字段的电子邮件地址的链接类型。
classEmailTypeForm(TypeForm):address=EmailField(label='E-Mail',required=True)subject=CharField(label='Subject',required=False,max_length=20)classEmailType(LinkType):identifier='email'type_label='E-Mail'form_class=EmailTypeFormdefreal_value(self):returnself.link.data('value')@propertydefhref(self)->Optional[str]:mail=self.real_value().get('address')subject=self.real_value().get('subject','')returnf'mailto:{mail}?subject={subject}'@propertydeflabel(self)->Optional[str]:returnself.real_value().get('address')