新闻详情

新闻详情

首页 / 资讯中心 / 详情

Wagtail Panels 参考详解:构建与定制 Wagtail 管理后台编辑界面的完整实践

发布时间:2026/9/13 18:36:44来源:尧图网络
Wagtail Panels 参考详解:构建与定制 Wagtail 管理后台编辑界面的完整实践
Wagtail Panels 参考详解构建与定制 Wagtail 管理后台编辑界面的完整实践【免费下载链接】wagtailA Django content management system focused on flexibility and user experience项目地址: https://gitcode.com/GitHub_Trending/wa/wagtailWagtail 的编辑界面由一套面板Panel机制驱动你只需在 Page 或 Snippet 模型上声明panels或content_panels、promote_panels等Wagtail 就会自动识别 Django 模型字段、生成带合适控件的表单并渲染成界面。本文基于官方参考文档docs/reference/panels.md及其对应的源码实现wagtail/admin/panels/包系统讲解全部内置面板类型、每一项定制参数以及Panel/BoundPanel两套 API 的工作流程读完后可独立为任意模型设计编辑表单、按权限裁剪字段并深入理解面板从声明到渲染的完整调用链。1. 面板机制字段如何自动变成表单控件Wagtail 的面板机制会自动识别 Django 模型字段并为它们提供合适的输入控件widget。你只需在模型中正常定义字段然后在定义面板时把字段名传入FieldPanel或合适的面板类型即可。从源码结构看这一自动识别发生在wagtail/admin/panels/model_utils.py中当模型没有显式panels定义时extract_panel_definitions_from_model_class()会遍历模型的可编辑字段优先询问字段控件的get_panel()方法 chooser 类字段会借此返回专用面板否则回退到FieldPanel见 model_utils.py。所有内置面板都是基础类Panel的子类且除特殊说明外都接受Panel的全部构造参数heading、classname、help_text、base_form_class、icon、attrs见 base.py 中的文档字符串。wagtail.admin.panels包的公开导出集中在init.py 中从base、field_panel、group、help_panel、inline_panel、multiple_chooser_panel、page_chooser_panel、title_field_panel等模块统一重导出。2. 内置面板类型详解2.1 FieldPanel基本模型字段的面板FieldPanel是用于基本 Django 模型字段类型的面板。它会根据模型字段定义提供默认图标和标题也可以通过构造参数自定义。源码定义见 field_panel.py。完整参数如下参数说明field_name模型定义中对应类属性的字段名FieldPanel.field_namewidget可选指定用于该字段的 Django 表单控件替代该字段类型的默认控件FieldPanel.widgetdisable_comments可选设为True时不显示该面板的字段级评论按钮permission可选按权限选择性显示字段。接受权限 codename如myapp.change_blog_category——当前用户没有该权限时字段将从表单中省略。也可以传入任意字符串如superuser作为 codename因为超级用户自动通过所有权限检查read_only可选禁止编辑者设置或更新该模型字段的值。大多数字段类型仍会在表单中渲染出字段值连同标签和帮助文本供编辑者查看但不显示任何表单输入表单会忽略 POST 数据中对该值的修改尝试例如通过在表单 HTML 中注入隐藏输入再提交。默认情况下StreamField或RichTextField的值会被脱敏以防止在表单中部渲染潜在不安全的 HTML自定义面板类型可通过覆写Panel.format_value_for_display()改变这一行为required_on_save可选指定保存草稿时是否对该字段强制执行必填约束。对 Page 模型以及使用DraftStateMixin的 Snippet默认保存草稿会跳过必填字段校验允许编辑不完整内容的草稿必填校验在发布、排期或提交工作流时生效。将其设为True可在保存草稿时就强制校验也可以在模型字段上直接设置required_on_save属性例如subtitle models.CharField(max_length255); subtitle.required_on_save True。注意未声明nullTrue的非文本字段如IntegerField、DateField在数据库层面不允许空值因此保存草稿时始终会被当作必填字段attrs可选一个字典向渲染出的面板 HTML 元素添加属性值为True/False的属性会渲染为 HTML5 布尔属性required_on_save的默认判定逻辑可以从 field_panel.py 的 get_form_options() 直接确认未显式设置时若对应数据库字段带有required_on_saveTrue或字段非null且内部类型不属于CharField/TextField/JSONField则视为必填否则该字段会被加入defer_required_on_fields从而在草稿阶段放宽必填约束。字段权限与只读在渲染期的检查也都在源码中可见BoundPanel.is_shown()在用户无权限时返回Falsefield_panel.py#L207-L223read_only字段的上下文由get_read_only_context_data()生成通过format_value_for_display()对 RichText/Stream 值做text_from_html()脱敏base.py#L211-L225。推荐这样写 python content_panels Page.content_panels [title, body]而不是content_panels Page.content_panels [ FieldPanel(title), FieldPanel(body), ]字符串简写的实现位于 expand_panel_list()字符串若是ManyToOneRel反向关联会展开为InlinePanel否则展开为FieldPanel。2.2 MultiFieldPanel把多个字段聚合到一个标题下MultiFieldPanel(children(), *args, permissionNone, **kwargs)把一个list或tuple中的多个FieldPanel或 chooser 面板聚合到同一个heading之下为复杂模型节省界面空间配合collapsed类见后文 CSS 类一节还可以默认折叠面板。参数children子面板的list或tuplepermission可选按权限显示面板语义与FieldPanel.permission相同——用户无权限时整个面板从表单中省略attrs可选同FieldPanel.attrs。实现上MultiFieldPanel是PanelGroup的一个轻量子类见 group.py#L191-L193而PanelGroup负责把各子面板的get_form_options()结果合并成一份表单选项group.py#L27-L73并在on_model_bound()阶段展开并绑定所有子面板group.py#L75-L79。2.3 InlinePanel内联编辑一对多子对象InlinePanel(relation_name, panelsNone, label, min_numNone, max_numNone, **kwargs)用于在独立模型之间通过关联建立对象簇例如一组相关链接、或图片轮播的幻灯片条目。参数relation_name簇上ParentalKey关系所给的related_name标签panels可选构成子对象表单的面板列表不指定时使用子模型上的panels定义label添加按钮文案和子面板标题。未提供heading时用作标题min_num可选用户必须提交的最少表单数量max_num可选用户必须提交的最多表单数量attrs可选同FieldPanel.attrs。源码见 inline_panel.py标题的推导顺序是heading→label→ 关系名把下划线替换为空格并首字母大写get_form_options()会把min_num/max_num转成 formset 的validate_min/validate_max选项并在存在延迟必填字段时为其单独构建 form 类inline_panel.py#L70-L99。字符串简写同样适用content_panels Page.content_panels [gallery_images]等价于content_panels Page.content_panels [InlinePanel(gallery_images)]这正是expand_panel_list()中ManyToOneRel分支的行为。2.3.1 InlinePanel 的 JavaScript DOM 事件当 InlinePanel 条目就绪、新增或被移除时你可能希望执行自定义 JavaScript。w-formset:ready、w-formset:added与w-formset:removed三个事件可以做到这一点。这些事件由前端 InlinePanel 组件发出见 client/src/components/InlinePanel/index.jsready、第 92 行removed与第 331 行added。示例假设BlogPage上有一个子模型建立 Blog 与 Person 的关联。class CustomInlinePanel(InlinePanel): class BoundPanel(InlinePanel.BoundPanel): class Media: js [js/inline-panel.js] class BlogPage(Page): # .. fields content_panels Page.content_panels [ CustomInlinePanel(blog_person_relationship), # ... other panels ]对应的 JavaScript// static/js/inline-panel.js document.addEventListener(w-formset:ready, function (event) { console.info(ready, event); }); document.addEventListener(w-formset:added, function (event) { console.info(added, event); }); document.addEventListener(w-formset:removed, function (event) { console.info(removed, event); });事件会被派发出来可据此触发自定义 JS 逻辑例如初始化一个自定义控件。2.4 MultipleChooserPanel一次多选的内联选择器MultipleChooserPanel(relation_name, chooser_field_nameNone, panelsNone, label, min_numNone, max_numNone, **kwargs)是InlinePanel的一个变体适用于内联子模型中包含一个指向实现了 Wagtail chooser 接口的模型的ForeignKey关系。Wagtail 的 images、documents、snippets 和 pages 都实现了该接口其他模型也可以通过注册自定义 ChooserViewSet 实现。与普通 InlinePanel 不同点击Add按钮后不会插入一个待填写的新表单而是直接打开该关联对象的多选模式 chooser 界面用户选择后回到主编辑表单子面板数量按所选条目数自动填充并预填。MultipleChooserPanel额外要求一个必需参数chooser_field_name指定 chooser 所关联的ForeignKey字段名。从源码看未提供该参数会直接抛出ImproperlyConfiguredmultiple_chooser_panel.py#L9-L17。示例假设BlogPage上有一个图片集的子模型class BlogPageGalleryImage(Orderable): page ParentalKey(BlogPage, on_deletemodels.CASCADE, related_namegallery_images) image models.ForeignKey( wagtailimages.Image, on_deletemodels.CASCADE, related_name ) caption models.CharField(blankTrue, max_length250) panels [ FieldPanel(image), FieldPanel(caption), ]则BlogPage上的MultipleChooserPanel定义为MultipleChooserPanel( gallery_images, labelGallery images, chooser_field_nameimage )渲染期其BoundPanel会把 chooser 控件通过 Telepath 打包为 JS 定义传给前端见 multiple_chooser_panel.py#L24-L56。2.5 FieldRowPanel横向并排布局FieldRowPanel(children(), *args, permissionNone, **kwargs)在编辑界面中创建列布局子面板并排显示而不是上下堆叠。FieldRowPanel特别适合缓解复杂模型字段过多带来的雪盲效应并改善同类字段之间的视觉关联。例如一个表示事件的模型同时有开始日期和结束日期把起止日期放在同一行更符合直觉。默认情况下面板被分成等宽列但可以通过给FieldRowPanel的每个子面板添加col*类名来覆盖。Wagtail 编辑界面基于网格系统布局col1-col12类可应用到 FieldRowPanel 的每个子面板上定义其跨越的列数。当网格项合计为 12 列时col3表示该字段占 3 列宽即四分之一宽col4表示 4 列宽即三分之一宽。参数children要并排显示的子面板列表/元组、permission可选语义同FieldPanel.permission、attrs可选同前。FieldRowPanel同样是PanelGroup的薄封装group.py#L186-L188渲染模板为wagtailadmin/panels/field_row_panel.html。2.6 HelpPanel显示说明性内容HelpPanel用于在编辑界面中展示对用户有帮助的信息。它不支持help_text参数源码的clone_kwargs()会显式删除该参数见 help_panel.py#L21-L28。参数content显示在面板中的 HTML 字符串template渲染整个面板 HTML 的模板路径默认wagtailadmin/panels/help_panel.htmlattrs可选同前。2.7 PageChooserPanel面向 Page 的专用 chooserFieldPanel也支持指向Page模型的ForeignKey但你可以显式使用PageChooserPanel以启用 Page 特有的定制。源码实现非常简洁它本质是FieldPanel的子类在设置了page_type或can_choose_root时向表单注入AdminPageChooser控件page_chooser_panel.py#L6-L29。from wagtail.models import Page from wagtail.admin.panels import PageChooserPanel class BookPage(Page): related_page models.ForeignKey( wagtailcore.Page, nullTrue, blankTrue, on_deletemodels.SET_NULL, related_name, ) content_panels Page.content_panels [ PageChooserPanel(related_page, demo.PublisherPage), ]PageChooserPanel接受一个必需的参数字段名。可选地传入一个页面类型appname.modelname字符串会把 chooser 过滤为仅显示该类型的页面也可以传入页面类型的列表或元组表示允许选择匹配其中任意类型的页面PageChooserPanel(related_page, [demo.PublisherPage, demo.AuthorPage])传入can_choose_rootTrue将允许编辑者选择树根节点作为页面。通常这不受欢迎因为树根从不是一个可用页面但在某些特殊场景下合适例如一个带自动相关文章流的页面可以用PageChooserPanel选择文章取自哪个子板块此时树根表示全站。2.8 FormSubmissionsPanel表单页的提交统计FormSubmissionsPanel位于wagtail.contrib.forms.panels为实现了wagtail.contrib.forms.models.AbstractForm模型的页面在编辑界面中添加一个只读区域显示该表单的提交总数以及跳转到提交列表的链接。from wagtail.contrib.forms.models import AbstractForm from wagtail.contrib.forms.panels import FormSubmissionsPanel class ContactFormPage(AbstractForm): content_panels [ FormSubmissionsPanel(), ]从源码看wagtail/contrib/forms/panels.py其标题默认由模型 verbose name 拼接为%(model_name)s submissions提交数通过get_submission_class()过滤page实例获得且当没有提交时面板会隐藏is_shown()返回submission_count。2.9 TitleFieldPanel标题字段与 slug 同步TitleFieldPanel是用于 Page 标题字段或其他模型主标题的面板。它提供默认的 classname、placeholder 和控件属性以启用与 slug 字段的自动同步这些默认值大多可通过构造参数定制并且支持FieldPanel的全部参数包括自定义 widget。源码见 title_field_panel.py。除继承的参数外它还有几个专用参数apply_if_live可选True时slug 同步行为不受发布状态影响默认False即仅当实例未处于 live或没有 live 属性时才应用classname可选默认titleplaceholder可选提供字符串时用作字段占位符False时不显示占位符True默认时使用Title*对Page模型为Page Title*若 widget 自带 placeholder 则优先使用 widget 的值targets可选覆盖默认的同步目标字段列表默认[slug]。注意 slugify/urlify 行为依赖 slug 字段使用wagtail.admin.widgets.slug控件。其BoundPanel通过 Stimulus 的w-sync控制器在focus/blur/change/keyup时机触发同步title_field_panel.py#L50-L56。3. 面板定制参数化控制编辑界面通过给面板/字段定义追加参数你可以控制字段在 Wagtail 页面编辑界面中的大部分呈现方式。Wagtail 的页面编辑界面继承了许多 Django admin 的行为因此许多定制选项与 Django 文档中的说明一致。3.1 图标Icons使用面板构造函数的icon参数可覆盖面板标题旁显示的图标。可用图标见文档中的图标列表docs/advanced_topics/icons.md。FieldPanel在不指定图标时会按字段类型回退到内置映射例如DateField → date、URLField → link-external、BooleanField → tick-inverse等field_panel.py#L156-L169chooser 类 ForeignKey 则取控件自身的icon属性。3.2 标题Heading使用heading参数设置面板标题。它会用作输入的 label并显示在内容小地图minimap上。若FieldPanel未设置 heading将自动使用表单字段的 label进而取自模型字段的verbose_name。这一回退逻辑在 field_panel.py 的 BoundPanel.init中实现面板指定 heading 时甚至会反向覆盖bound_field.label保证 Panel、BoundPanel 与 Field 三处标题一致。3.3 CSS 类CSS classes使用classname参数向面板添加 CSS 类。该类会应用到面板的 HTMLsection元素上可用于附加样式或控制行为。两个常用值title类可让输入以更大的字号和字重突出显示collapsed类使编辑页面加载时面板折叠在标题之下content_panels [ MultiFieldPanel( [ FieldPanel(cover), FieldPanel(book_file), FieldPanel(publisher), ], headingCollection of Book Fields, classnamecollapsed, ), ]3.4 帮助文本Help text使用help_text参数自定义显示在输入上方的帮助文本。若FieldPanel未设置将自动使用表单字段的help_text进而取自模型字段的help_text。3.5 占位符文本Placeholder text默认情况下 Wagtail 使用字段 label 作为占位符文本。要修改它需向FieldPanel传入一个设置了placeholder属性的 widget可以选用 Django 的表单控件也可以选用wagtail.admin.widgets中任意 Wagtail 控件。例如为BookSnippet 模型定制占位符# models.py from django import forms # 默认 Django 控件在这里 from wagtail.admin import widgets # 使用 Wagtail 的专用日期时间控件 class Book(models.Model): title models.CharField(max_length256) release_date models.DateField() price models.DecimalField(max_digits5, decimal_places2) # 你可以分别创建控件 title_widget forms.TextInput(attrs{placeholder: Enter Full Title}) # 使用与字段类型匹配、符合预期效果的控件 date_widget widgets.AdminDateInput(attrs{placeholder: dd-mm-yyyy}) panels [ TitleFieldPanel(title, widgettitle_widget), # 然后作为变量传入 FieldPanel(release_date, widgetdate_widget), FieldPanel( price, widgetforms.NumberInput(attrs{placeholder: Retail price on release}), ), # 或者直接内联传入 ]3.6 必填字段与隐藏字段必填要让某个输入或 chooser 选择成为必填项在模型定义中给字段加blankFalse。隐藏在没有顶层面板定义时模型中每个字段都会被构造一个FieldPanel。若要隐藏某字段用editableFalse定义它只要字段未出现在 panels 定义中它同样会被隐藏。3.7 权限Permissions大多数面板都接受permission关键字参数允许把一组面板或特定面板限定给特定权限。下例中notes 对所有编辑者可见cost 和 details 仅对拥有submit权限的人可见budget approval 仅对超级用户可见。注意超级用户可访问所有字段content_panels [ FieldPanel(notes), MultiFieldPanel( [ FieldPanel(cost), FieldPanel(details), ], headingBudget details, classnamecollapsed, permissionsubmit, ), FieldPanel(budget_approval, permissionsuperuser), ]权限检查在两处生效字段级由FieldPanel.BoundPanel.is_shown()调用request.user.has_perm()决定field_panel.py#L207-L223组级由PanelGroup.BoundPanel.is_shown()对整个面板组做同样检查group.py#L135-L145。3.8 附加 HTML 属性attrs使用attrs参数向面板的 HTML 元素添加自定义属性例如data-*属性。attrs接受一个字典键为属性名其渲染方式与 Django 控件的attrs一致True和False会按 HTML5 布尔属性处理。例如用attrs把 Stimulus 控制器集成到面板中content_panels [ MultiFieldPanel( [ FieldPanel(cover), FieldPanel(book_file), FieldPanel(publisher, attrs{data-my-controller-target: myTarget}), ], headingCollection of Book Fields, classnamecollapsed, attrs{data-controller: my-controller}, ), ]渲染端BoundPanel会把attrs注入模板上下文base.py#L288-L292因此这些属性最终出现在面板的section元素上。4. Panel API绑定与渲染的底层流程Panel及其内部类BoundPanel是渲染 Wagtail 面板所依据的两套参考 API。理解它们有助于编写自定义面板。4.1Panel面板定义Panel定义页面和其他模型编辑表单界面的一部分或全部。每个模型都关联一个顶层面板定义旧称 edit handler由嵌套的Panel对象构成。它提供方法根据结构中所有面板收集出的字段列表和其他参数得到ModelForm子类然后把该表单渲染为 HTML定义见 base.py#L52-L148。关键方法bind_to_model(model)创建一个带model属性的面板定义克隆随后调用on_model_bound()。这是定义进入与模型绑定状态的入口on_model_bound()绑定完成后的钩子面板可覆写它执行与模型相关的初始化。例如InlinePanel在这里解析关联管理器并推导labelinline_panel.py#L101-L105FormSubmissionsPanel在这里生成默认标题clone()/clone_kwargs()通过clone_kwargs()返回的关键字参数创建自身克隆所有子类都覆写了clone_kwargs()以带上自己的专属字段get_form_options()返回应并入表单类定义的选项字典如fields、formsets、widgets、defer_required_on_fields仅在绑定到模型后被调用get_form_class()构造包含所有子级命名字段与 formset 的表单类优先使用面板的base_form_class其次是模型的base_form_class最后回退到WagtailAdminModelFormbase.py#L123-L139get_bound_panel(instance, request, form, prefix)返回可作为组件渲染到模板上的BoundPanel实例面板未绑定模型或BoundPanel未继承Panel.BoundPanel时会抛ImproperlyConfiguredclean_name属性仅由 ASCII 字母数字和下划线组成的面板名通常由 heading 生成用于生成标识符。顶层面板的获取入口是 get_edit_handler()优先使用模型上的edit_handler否则用提取出的字段面板列表构造ObjectList最后统一bind_to_model(model)。4.2BoundPanel已绑定面板模板组件BoundPanelbase.py#L227-L339是已关联到模型实例、表单和请求的面板的模板组件在标准模板组件能力之外提供以下属性与方法panel对应的面板定义instance关联的模型实例request关联的请求对象form关联的表单对象prefix该面板的唯一前缀用于 HTML IDid_for_label()返回供引用该面板的外部label使用的 HTML IDis_shown()该面板是否应该被渲染False时模板输出中跳过它。此外BoundPanel还实现了 Telepath 适配telepath_adapter_name wagtail.panels.Panel把面板树打包为 JS 选项js_opts()/telepath_pack()——这正是前端 InlinePanel、同步 slug 等交互能力能拿到面板结构的原因。4.3 一次完整的数据流综合源码面板的工作流可以概括为模型类加载后get_edit_handler(model)取出顶层面板定义并bind_to_model()字符串项在expand_panel_list()中展开为具体面板打开编辑视图时get_form_class()沿面板树收集get_form_options()PanelGroup递归合并子选项动态生成ModelForm子类每个面板通过get_bound_panel()生成BoundPanel在模板中以组件方式渲染组级BoundPanel的media属性会汇总可见子面板的静态资源group.py#L147-L152权限在此阶段通过is_shown()二次过滤前端通过 Telepath 定义初始化交互表单集事件、slug 同步等。5. 小结与延伸阅读内置面板的完整实现分布在 wagtail/admin/panels/ 目录base.pyPanel/BoundPanel、field_panel.pyFieldPanel、group.pyPanelGroup/FieldRowPanel/MultiFieldPanel/ObjectList/TabbedInterface、inline_panel.pyInlinePanel、multiple_chooser_panel.pyMultipleChooserPanel、help_panel.pyHelpPanel、page_chooser_panel.pyPageChooserPanel、title_field_panel.pyTitleFieldPanel表单提交面板单独位于 wagtail/contrib/forms/panels.py面板相关的测试位于 wagtail/admin/tests/其中 panels 测试覆盖了字段权限、required_on_save、只读渲染等行为配套的参考文档还有docs/reference/panels.md中指向的页面类型/视图集文档以及docs/extending/下的模板组件文档BoundPanel的组件用法即基于它。掌握以上内容后你就可以覆盖绝大多数编辑界面定制需求用字符串简写快速声明字段、用MultiFieldPanel/FieldRowPanel组织布局、用InlinePanel/MultipleChooserPanel处理子对象、用permission/read_only/required_on_save做细粒度访问控制并在需要时通过Panel/BoundPanelAPI 编写完全自定义的面板。【免费下载链接】wagtailA Django content management system focused on flexibility and user experience项目地址: https://gitcode.com/GitHub_Trending/wa/wagtail创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Apache Airflow Apache HDFS Provider 版本演进与核心能力全解析:从 snakebite 迁移到 WebHDFS 与远程日志体系 2026/9/13 19:18:47

Apache Airflow Apache HDFS Provider 版本演进与核心能力全解析:从 snakebite 迁移到 WebHDFS 与远程日志体系

Apache Airflow Apache HDFS Provider 版本演进与核心能力全解析:从 snakebite 迁移到 WebHDFS 与远程日志体系 【免费下载链接】airflow Apache Airflow - A platform to programmatically author, schedule, and monitor workflows 项目地址: https://gitcode.c…

阅读更多 →
WeKan 截止日期(Due Date)机制详解:颜色编码、倒计时与截止日变更追踪 2026/9/13 19:18:47

WeKan 截止日期(Due Date)机制详解:颜色编码、倒计时与截止日变更追踪

WeKan 截止日期(Due Date)机制详解:颜色编码、倒计时与截止日变更追踪 【免费下载链接】wekan The Open Source kanban, built with Meteor. GitHub issues/PRs are only for FLOSS Developers, not for support, support is at https://weka…

阅读更多 →
Google Mobile Ads(GMA)iOS Banner 广告接入指南:从测试广告单元到自适应尺寸的完整工作流 2026/9/13 19:18:47

Google Mobile Ads(GMA)iOS Banner 广告接入指南:从测试广告单元到自适应尺寸的完整工作流

Google Mobile Ads(GMA)iOS Banner 广告接入指南:从测试广告单元到自适应尺寸的完整工作流 【免费下载链接】skills Agent Skills for Google products and technologies 项目地址: https://gitcode.com/GitHub_Trending/skills29/skills …

阅读更多 →
本地部署DeepSeek大模型的基本方法(含Windows On ARM平台) 2026/9/13 19:18:47

本地部署DeepSeek大模型的基本方法(含Windows On ARM平台)

在Windows中按照下载对应的框架:点击这里Ollama 【Windows x86的平台】 正常安装Ollama程序 然后点击下图中的内容,然后随便在文本框里面输入一句话,则程序会自动下载DeepSeek的模型 下载完成后,输入如下指令让外部的设备也能访…

阅读更多 →
无人机EL设备选型:跳出参数误区,场景先于指标 2026/9/13 19:18:47

无人机EL设备选型:跳出参数误区,场景先于指标

跳出参数误区:SW-W32 重新定义无人机 EL 设备选型逻辑做无人机系统集成这几年,我见过太多项目从选型阶段就埋下隐患。尤其是 EL 设备这一块——也就是机载电子负载、供配电管理、链路终端这类航电设备——大家拿到选型表,第一反应就是比参数&…

阅读更多 →
Vue 3豆瓣仿制项目:工程化实战与移动端适配全解析 2026/9/13 19:15:47

Vue 3豆瓣仿制项目:工程化实战与移动端适配全解析

简介:这是一份面向前端初学者与Vue.js入门学习者的豆瓣仿制网站实训项目源码,聚焦单页应用开发全流程实践,帮助开发者系统掌握Vue核心生态与工程化能力。资源共51个文件,包含11个功能完备的Vue组件(如HomeView、Detail…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞