摘要:一些表单界面元素文本框或复选框非常简单并内置在中,而其他会复杂些像弹出日期选择等操作控件。和标签中的属性指定了当前文本框提交的数据的名称,它必须与表单类中的字段名称对应,否则服务器无法将字段和数据正确的对应起来。
前面我们已经学会如何用Markdown语法书写文章了。
但是还有问题呀。之前写文章都是在后台中进行的,万一有别的普通用户也要发表文章怎么办?万一我想拓展些后台中没有的提交验证功能又怎么办?
本章即讲述如何在前台中提交新的文章,以便满足开发者各种各样的特殊需求 。
Forms表单类
在HTML中,表单是在
,它允许访客做类似输入文本、选择选项、操作对象或空间等动作,然后发送这些信息到服务端。一些表单界面元素(文本框或复选框)非常简单并内置在HTML中,而其他会复杂些:像弹出日期选择等操作控件。
处理表单是一件挺复杂的事情。想想看Django的admin,许多不同类型的数据可能需要在一张表单中准备显示,渲染成HTML,使用方便的界面进行编辑,传到服务器,验证和清理数据,然后保存或跳过进行下一步处理。
Django的表单功能可以简化上述工作的大部分内容,并且也能比大多数程序员自己编写代码去实现来的更安全。
Django表单系统的核心组件是 Form 类 ,它能够描述一张表单并决定它如何工作及呈现。
要使用Form 类也很简单,需要在article/ 中创建forms.py 文件,并写入如下代码:
article/forms.py
# 引入表单类
from django import forms
# 引入文章模型
from .models import ArticlePost
# 写文章的表单类
class ArticlePostForm(forms.ModelForm):
class Meta:
# 指明数据模型来源
model = ArticlePost
# 定义表单包含的字段
fields = ("title", "body")
代码中ArticlePostForm 类继承了Django的表单类forms.ModelForm ,并在类中定义了内部类class Meta (之前提到过,还记得吗),指明了数据模型的来源,以及表单中应该包含数据模型的哪些字段。
在ArticlePost 模型中,created 和updated 字段为自动生成,不需要填入;author 字段暂时固定为id=1的管理员用户,也不用填入;剩下的title 和body 就是表单需要填入的内容了。
接下来,改写article/views.py ,添加一个视图函数以处理写文章的请求:
article/views.py
...
# 引入redirect重定向模块
from django.shortcuts import render, redirect
# 引入HttpResponse
from django.http import HttpResponse
# 引入刚才定义的ArticlePostForm表单类
from .forms import ArticlePostForm
# 引入User模型
from django.contrib.auth.models import User
...
# 写文章的视图
def article_create(request):
# 判断用户是否提交数据
if request.method == "POST":
# 将提交的数据赋值到表单实例中
article_post_form = ArticlePostForm(data=request.POST)
# 判断提交的数据是否满足模型的要求
if article_post_form.is_valid():
# 保存数据,但暂时不提交到数据库中
new_article = article_post_form.save(commit=False)
# 指定数据库中 id=1 的用户为作者
new_article.author = User.objects.get(id=1)
# 将新文章保存到数据库中
new_article.save()
# 完成后返回到文章列表
return redirect("article:article_list")
# 如果数据不合法,返回错误信息
else:
return HttpResponse("表单内容有误,请重新填写。")
# 如果用户请求获取数据
else:
# 创建表单类实例
article_post_form = ArticlePostForm()
# 赋值上下文
context = { "article_post_form": article_post_form }
# 返回模板
return render(request, "article/create.html", context)
分析一下上面的代码。当视图函数接收到一个客户端的request 请求时,首先根据request.method 判断用户是要提交数据(POST)、还是要获取数据(GET) :
如果用户是提交数据 ,将POST给服务器的表单数据赋于article_post_form 实例。
然后使用Django内置的方法.is_valid() 判断提交的数据是否满足模型的要求。
如果满足要求 ,保存表单中的数据(但是commit=False 暂时不提交到数据库,因为author 还未指定),并指定author 为id=1的管理员用户。然后提交到数据库,并通过redirect 返回文章列表。redirect 可通过url地址的名字,反向解析到对应的url。
如果不满足要求 ,则返回一个字符串"表单内容有误,请重新填写。" ,告诉用户出现了什么问题。
如果用户是获取数据 ,则返回一个空的表单类对象,提供给用户填写。
其实逻辑并不复杂,不明白的读者请逐句理解。
这里特别提醒Django中的缩进不能够空格和tab键混用,否则会报错。 由于不同的编辑器对tab的显示不尽相同,因此你应该坚持使用空格键缩进。
写好视图之后,就需要写模板文件了。在templates/article/ 中创建create.html :
templates/article/create.html
{% extends "base.html" %} {% load staticfiles %}
{% block title %} 写文章 {% endblock title %}
{% block content %}
{% endblock content %}
html文件还是一如既往的长。再重复一次,看不懂html文件语法也没有关系,先照着抄一遍,以后再慢慢理解,不影响目前Django的学习。
对其中的新内容进行审视:
.. 标签中的内容就是需要提交的表单。
method="post" 指定了表单提交的方式为POST(与视图函数中的
request.method 相联系);
action="." 指定了表单提交的地址为默认的当前url。
关于{% csrf_token %} ,它是Django中一个与网络安全相关的中间件验证。目前我们暂时不去深究它的实现,只需要知道表单中必须包含它就可以了 ,否则将会得到一个403错误。
和</b>标签中的<b>name=""</b>属性指定了当前文本框提交的数据的名称,它必须与表单类中的字段名称对应,否则服务器无法将字段和数据正确的对应起来。</p>
<p>最后老规矩,在<b>article/urls.py</b>中增加一个写文章的url地址:</p>
<pre>article/urls.py
urlpatterns = [
...
# 写文章
path("article-create/", views.article_create, name="article_create"),
]</pre>
<p>大功告成了,不要着急,先喝口水,万一有bug又得忙活半天了。<strong>如果报错也不要慌张,开发过程一定是曲折的,耐心看看Django给出的错误提示,线索就在其中。</strong></p>
<p>保存修改并运行服务器,地址栏中输入:<b>http://127.0.0.1:8000/article/article-create/</b>,看到如下界面:</p>
<p><script type="text/javascript">showImg("https://segmentfault.com/img/remote/1460000016540097?w=1200&h=646");</script></p>
<p>很好,似乎正常工作起来了。接着随便输入些Markdown语法的文章,测试功能是否正常:</p>
<p><script type="text/javascript">showImg("https://segmentfault.com/img/remote/1460000016540098?w=1200&h=646");</script></p>
<p>点击<strong>完成</strong>按钮后,页面会回到文章列表:</p>
<p><script type="text/javascript">showImg("https://segmentfault.com/img/remote/1460000016540099?w=1200&h=644");</script></p>
<p>刚才提交的文章神奇的出现在列表中了。</p>
<p>点击<strong>阅读本文</strong>按钮,进入文章详情页面:</p>
<p><script type="text/javascript">showImg("https://segmentfault.com/img/remote/1460000016540100?w=1200&h=648");</script></p>
<p>出现了具有<strong>Markdown</strong>语法的一篇优美的文章。</p>
<p>使用Django编写博客是不是非常有成就感呢?</p>
<p>别激动,还有一些收尾工作需要做。</p>
<b>优化写文章入口</b>
<p>与之前类似,我们需要在导航栏中设置一个<strong>写文章</strong>的入口,优化使用体验。</p>
<p>将下列代码加入到<b>templates/header.html</b>中:</p>
<pre><li class="nav-item">
<a class="nav-link" href="{% url "article:article_create" %}">写文章</a>
</li></pre>
<p>读者是否清楚,上面的代码应该放置在什么位置呢?</p>
<p>保存后刷新浏览器界面,<strong>导航栏</strong>有了如下变化:</p>
<p><script type="text/javascript">showImg("https://segmentfault.com/img/remote/1460000016540101?w=1200&h=645");</script></p>
<p>点击<strong>写文章</strong>按钮,就可以进入写新文章的页面了,从此再也不用手动输入繁琐的url地址了。</p>
<p>世界是多么的美好。</p>
<b>总结</b>
<p>本章学习了使用Django的表单类,完成了提交新文章的基本功能。当然目前暂时还没有真正将文章和登录的用户关联起来;等到学习了用户管理的知识,再回头来处理这部分的内容。</p>
<p>下一章继续学习如何删除一篇文章。</p>
<p>有疑问请在杜赛的个人网站留言,我会尽快回复。</p>
<p>或Email私信我:dusaiphoto@foxmail.com</p>
<p>项目完整代码:Django_blog_tutorial
</p>
<pre>转载请告知作者并注明出处。</pre>
</div>
<div class="mt-64 tags-seach" >
<div class="tags-info">
<a style="width:120px;" title="云服务器" href="https://www.ucloud.cn/site/active/kuaijiesale.html?ytag=seo">云服务器</a>
<a style="width:120px;" title="GPU云服务器" href="https://www.ucloud.cn/site/product/gpu.html">GPU云服务器</a>
<a style="width:120px;" title="发表文章的html" href="https://www.ucloud.cn/yun/tag/fabiaowenzhangdehtml/">发表文章的html</a>
<a style="width:120px;" title="搭建个人博客" href="https://www.ucloud.cn/yun/tag/dajiangerenboke/">搭建个人博客</a>
<a style="width:120px;" title="个人博客搭建" href="https://www.ucloud.cn/yun/tag/gerenbokedajian/">个人博客搭建</a>
<a style="width:120px;" title="如何用wordpress搭建个人博客" href="https://www.ucloud.cn/yun/tag/ruheyongwordpressdajiangerenboke/">如何用wordpress搭建个人博客</a>
</div>
</div>
<div class="entry-copyright mb-30">
<p class="mb-15"> 文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。</p>
<p>转载请注明本文地址:https://www.ucloud.cn/yun/42531.html</p>
</div>
<ul class="pre-next-page">
<li class="ellipsis"><a class="hpf" href="https://www.ucloud.cn/yun/42530.html">上一篇:【自动化测试】发送邮件 SMTP</a></li>
<li class="ellipsis"><a class="hpf" href="https://www.ucloud.cn/yun/42532.html">下一篇:为了写中秋这篇文章,我学了 20 种编程语言!</a></li>
</ul>
</div>
<div class="about_topicone-mid">
<h3 class="top-com-title mb-0"><span data-id="0">相关文章</span></h3>
<ul class="com_white-left-mid atricle-list-box">
<li>
<div class="atricle-list-right">
<h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/44922.html"><b><em>Django</em><em>搭建</em><em>个人</em><em>博客</em>:用户的登录和登出</b></a></h2>
<p class="ellipsis2 good">摘要:最常见的用法就是存储用户的登录数据。如果用户未登录,则显示登录两个字提醒用户可以点击登录。创建文件用户登录配置根路由用户管理配置因为这个并没有改动,因此不用迁移数据。总结本章用到了表单类模板语句用户验证等知识完成了用户管理的登录和退出。
用户管理
用户数据可以说是大部分网站最重要的资产。用户管理就是对用户数据进行增删改查等操作的功能,自然也就非常的重要了。
本章开始学习用户管理的内容,...</p>
<div class="com_white-left-info">
<div class="com_white-left-infol">
<a href="https://www.ucloud.cn/yun/u-951.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/09/small_000000951.jpg" alt=""><span class="layui-hide64">whidy</span></a>
<time datetime="">2019-07-31 11:17</time>
<span><i class="fa fa-commenting"></i>评论0</span>
<span><i class="fa fa-star"></i>收藏0</span>
</div>
</div>
</div>
</li>
<li>
<div class="atricle-list-right">
<h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/42908.html"><b><em>Django</em><em>搭建</em><em>个人</em><em>博客</em>:在博文中<em>发表</em>评论</b></a></h2>
<p class="ellipsis2 good">摘要:确认创建成功后,记得在中注册因为我们想显示发表评论的时间,修改时区设置为上海的时区。处理错误请求发表评论仅接受请求。返回到一个适当的中即用户发送评论后,重新定向到文章详情页面。总结本章实现了发表评论展示评论的功能。
在没有互联网的年代,我们用日记来记录每天的心得体会。小的时候我有一个带锁的日记本,生怕被别人看见里面写了啥,钥匙藏得那叫一个绝。
现在时代变了,网络版的日记本:博客,却巴不...</p>
<div class="com_white-left-info">
<div class="com_white-left-infol">
<a href="https://www.ucloud.cn/yun/u-103.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/01/small_000000103.jpg" alt=""><span class="layui-hide64">Jinkey</span></a>
<time datetime="">2019-07-30 18:42</time>
<span><i class="fa fa-commenting"></i>评论0</span>
<span><i class="fa fa-star"></i>收藏0</span>
</div>
</div>
</div>
</li>
<li>
<div class="atricle-list-right">
<h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/43260.html"><b><em>Django</em><em>搭建</em><em>个人</em><em>博客</em>:给<em>文章</em>加个漂亮的标题图</b></a></h2>
<p class="ellipsis2 good">摘要:下一步就是修改视图。判断语句的条件有两个博文的标题图不是必须的,剔除掉没有标题图的文章,这些文章不需要处理图片。总结本章学习了如何上传并处理文章的标题图,从此博客首页就有了漂亮的外观。
现在虽然博客的功能大都实现了,但是界面还是比较朴素,特别是首页的文章列表几乎全是文字,看多了难免疲劳。因此,给每个文章标题配一张标题图,不仅美观,用户也能通过图片快速了解文章内容。实际上大部分社交网站也...</p>
<div class="com_white-left-info">
<div class="com_white-left-infol">
<a href="https://www.ucloud.cn/yun/u-382.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/03/small_000000382.jpg" alt=""><span class="layui-hide64">taowen</span></a>
<time datetime="">2019-07-31 10:06</time>
<span><i class="fa fa-commenting"></i>评论0</span>
<span><i class="fa fa-star"></i>收藏0</span>
</div>
</div>
</div>
</li>
<li>
<div class="atricle-list-right">
<h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/44920.html"><b><em>Django</em><em>搭建</em><em>个人</em><em>博客</em>:用户的注册</b></a></h2>
<p class="ellipsis2 good">摘要:既然有登录登出,那么用户的注册肯定也是少不了的。用户在注册成功后会自动登录并返回博客列表页面。总结本章用到了表单类对数据进行验证清洗等知识,完成了用户的注册功能。
既然有登录登出,那么用户的注册肯定也是少不了的。
注册表单类
用户注册时会用到表单来提交账号、密码等数据,所以需要写注册用的表单/userprofile/forms.py:
/userprofile/forms.py
.....</p>
<div class="com_white-left-info">
<div class="com_white-left-infol">
<a href="https://www.ucloud.cn/yun/u-362.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/03/small_000000362.jpg" alt=""><span class="layui-hide64">leanote</span></a>
<time datetime="">2019-07-31 11:16</time>
<span><i class="fa fa-commenting"></i>评论0</span>
<span><i class="fa fa-star"></i>收藏0</span>
</div>
</div>
</div>
</li>
<li>
<div class="atricle-list-right">
<h2 class="ellipsis2"><a class="hpf" href="https://www.ucloud.cn/yun/43162.html"><b><em>Django</em><em>搭建</em><em>个人</em><em>博客</em>:<em>文章</em>标签功能</b></a></h2>
<p class="ellipsis2 good">摘要:每一篇文章的标签可能都不一样,并且还可能拥有多个标签,这是与栏目功能不同的。列表中显示标签虽然保存标签的功能已经实现了,还得把它显示出来才行。更多的用法请阅读官方文档总结本章学习了使用来完成标签功能。
标签是作者从文章中提取的核心词汇,其他用户可以通过标签快速了解文章的关注点。每一篇文章的标签可能都不一样,并且还可能拥有多个标签,这是与栏目功能不同的。
好在标签功能也有优秀的三方库:D...</p>
<div class="com_white-left-info">
<div class="com_white-left-infol">
<a href="https://www.ucloud.cn/yun/u-1247.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/12/small_000001247.jpg" alt=""><span class="layui-hide64">Amio</span></a>
<time datetime="">2019-07-31 10:03</time>
<span><i class="fa fa-commenting"></i>评论0</span>
<span><i class="fa fa-star"></i>收藏0</span>
</div>
</div>
</div>
</li>
</ul>
</div>
<div class="topicone-box-wangeditor">
<h3 class="top-com-title mb-64"><span>发表评论</span></h3>
<div class="xcp-publish-main flex_box_zd">
<div class="unlogin-pinglun-box">
<a href="javascript:login()" class="grad">登陆后可评论</a>
</div> </div>
</div>
<div class="site-box-content">
<div class="site-content-title">
<h3 class="top-com-title mb-64"><span>0条评论</span></h3>
</div>
<div class="pages"></ul></div>
</div>
</div>
<div class="layui-col-md4 layui-col-lg3 com_white-right site-wrap-right">
<div class="">
<div class="com_layuiright-box user-msgbox">
<a href="https://www.ucloud.cn/yun/u-115.html"><img src="https://www.ucloud.cn/yun/data/avatar/000/00/01/small_000000115.jpg" alt=""></a>
<h3><a href="https://www.ucloud.cn/yun/u-115.html" rel="nofollow">Java3y</a></h3>
<h6>男<span>|</span>高级讲师</h6>
<div class="flex_box_zd user-msgbox-atten">
<a href="javascript:attentto_user(115)" id="attenttouser_115" class="grad follow-btn notfollow attention">我要关注</a>
<a href="javascript:login()" title="发私信" >我要私信</a>
</div>
<div class="user-msgbox-list flex_box_zd">
<h3 class="hpf">TA的文章</h3>
<a href="https://www.ucloud.cn/yun/ut-115.html" class="box_hxjz">阅读更多</a>
</div>
<ul class="user-msgbox-ul">
<li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/116320.html">前端面试每日3+1(周汇总2019.08.25)</a></h3>
<p>阅读 3582<span>·</span>2019-08-30 15:44</p></li>
<li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/115535.html">微信公众号开发通用任务清单</a></h3>
<p>阅读 874<span>·</span>2019-08-30 13:46</p></li>
<li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/114762.html">2019年3月所遇知识点整理</a></h3>
<p>阅读 2281<span>·</span>2019-08-30 11:05</p></li>
<li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/114394.html">简单上手CSS-Shadow</a></h3>
<p>阅读 3429<span>·</span>2019-08-29 18:32</p></li>
<li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/112813.html">基础练习-登陆界面</a></h3>
<p>阅读 2286<span>·</span>2019-08-29 13:56</p></li>
<li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/112259.html">gulp+browser-sync实现前端自动化刷新</a></h3>
<p>阅读 1386<span>·</span>2019-08-29 12:57</p></li>
<li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/111186.html">20 个 CSS 高级技巧汇总</a></h3>
<p>阅读 838<span>·</span>2019-08-28 18:21</p></li>
<li><h3 class="ellipsis"><a href="https://www.ucloud.cn/yun/108378.html">[ 一起学React系列 -- 0 ] React技术栈学习路线</a></h3>
<p>阅读 1879<span>·</span>2019-08-26 12:16</p></li>
</ul>
</div>
<!-- 文章详情右侧广告-->
<div class="com_layuiright-box">
<h6 class="top-com-title"><span>最新活动</span></h6>
<div class="com_adbox">
<div class="layui-carousel" id="right-item">
<div carousel-item>
<div>
<a href="https://www.ucloud.cn/site/active/kuaijiesale.html?ytag=seo" rel="nofollow">
<img src="https://www.ucloud.cn/yun/data/attach/240625/2rTjEHmi.png" alt="云服务器">
</a>
</div>
<div>
<a href="https://www.ucloud.cn/site/product/gpu.html" rel="nofollow">
<img src="https://www.ucloud.cn/yun/data/attach/240807/7NjZjdrd.png" alt="GPU云服务器">
</a>
</div>
</div>
</div>
</div> <!-- banner结束 -->
<div class="adhtml">
</div>
<script>
$(function(){
$.ajax({
type: "GET",
url:"https://www.ucloud.cn/yun/ad/getad/1.html",
cache: false,
success: function(text){
$(".adhtml").html(text);
}
});
})
</script> </div> </div>
</div>
</div>
</div>
</section>
<!-- wap拉出按钮 -->
<div class="site-tree-mobile layui-hide">
<i class="layui-icon layui-icon-spread-left"></i>
</div>
<!-- wap遮罩层 -->
<div class="site-mobile-shade"></div>
<!--付费阅读 -->
<div id="payread">
<div class="layui-form-item">阅读需要支付1元查看</div>
<div class="layui-form-item"><button class="btn-right">支付并查看</button></div>
</div>
<script>
var prei=0;
$(".site-seo-depict pre").each(function(){
var html=$(this).html().replace("<code>","").replace("</code>","").replace('<code class="javascript hljs" codemark="1">','');
$(this).attr('data-clipboard-text',html).attr("id","pre"+prei);
$(this).html("").append("<code>"+html+"</code>");
prei++;
})
$(".site-seo-depict img").each(function(){
if($(this).attr("src").indexOf('data:image/svg+xml')!= -1){
$(this).remove();
}
})
$("LINK[href*='style-49037e4d27.css']").remove();
$("LINK[href*='markdown_views-d7a94ec6ab.css']").remove();
layui.use(['jquery', 'layer','code'], function(){
$("pre").attr("class","layui-code");
$("pre").attr("lay-title","");
$("pre").attr("lay-skin","");
layui.code();
$(".layui-code-h3 a").attr("class","copycode").html("复制代码 ").attr("onclick","copycode(this)");
});
function copycode(target){
var id=$(target).parent().parent().attr("id");
var clipboard = new ClipboardJS("#"+id);
clipboard.on('success', function(e) {
e.clearSelection();
alert("复制成功")
});
clipboard.on('error', function(e) {
alert("复制失败")
});
}
//$(".site-seo-depict").html($(".site-seo-depict").html().slice(0, -5));
</script>
<link rel="stylesheet" type="text/css" href="https://www.ucloud.cn/yun/static/js/neweditor/code/styles/tomorrow-night-eighties.css">
<script src="https://www.ucloud.cn/yun/static/js/neweditor/code/highlight.pack.js" type="text/javascript"></script>
<script src="https://www.ucloud.cn/yun/static/js/clipboard.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<script>
function setcode(){
var _html='';
document.querySelectorAll('pre code').forEach((block) => {
var _tmptext=$.trim($(block).text());
if(_tmptext!=''){
_html=_html+_tmptext;
console.log(_html);
}
});
}
</script>
<script>
function payread(){
layer.open({
type: 1,
title:"付费阅读",
shadeClose: true,
content: $('#payread')
});
}
// 举报
function jupao_tip(){
layer.open({
type: 1,
title:false,
shadeClose: true,
content: $('#jubao')
});
}
$(".getcommentlist").click(function(){
var _id=$(this).attr("dataid");
var _tid=$(this).attr("datatid");
$("#articlecommentlist"+_id).toggleClass("hide");
var flag=$("#articlecommentlist"+_id).attr("dataflag");
if(flag==1){
flag=0;
}else{
flag=1;
//加载评论
loadarticlecommentlist(_id,_tid);
}
$("#articlecommentlist"+_id).attr("dataflag",flag);
})
$(".add-comment-btn").click(function(){
var _id=$(this).attr("dataid");
$(".formcomment"+_id).toggleClass("hide");
})
$(".btn-sendartcomment").click(function(){
var _aid=$(this).attr("dataid");
var _tid=$(this).attr("datatid");
var _content=$.trim($(".commenttext"+_aid).val());
if(_content==''){
alert("评论内容不能为空");
return false;
}
var touid=$("#btnsendcomment"+_aid).attr("touid");
if(touid==null){
touid=0;
}
addarticlecomment(_tid,_aid,_content,touid);
})
$(".button_agree").click(function(){
var supportobj = $(this);
var tid = $(this).attr("id");
$.ajax({
type: "GET",
url:"https://www.ucloud.cn/yun/index.php?topic/ajaxhassupport/" + tid,
cache: false,
success: function(hassupport){
if (hassupport != '1'){
$.ajax({
type: "GET",
cache:false,
url: "https://www.ucloud.cn/yun/index.php?topic/ajaxaddsupport/" + tid,
success: function(comments) {
supportobj.find("span").html(comments+"人赞");
}
});
}else{
alert("您已经赞过");
}
}
});
});
function attenquestion(_tid,_rs){
$.ajax({
//提交数据的类型 POST GET
type:"POST",
//提交的网址
url:"https://www.ucloud.cn/yun/favorite/topicadd.html",
//提交的数据
data:{tid:_tid,rs:_rs},
//返回数据的格式
datatype: "json",//"xml", "html", "script", "json", "jsonp", "text".
//在请求之前调用的函数
beforeSend:function(){},
//成功返回之后调用的函数
success:function(data){
var data=eval("("+data+")");
console.log(data)
if(data.code==2000){
layer.msg(data.msg,function(){
if(data.rs==1){
//取消收藏
$(".layui-layer-tips").attr("data-tips","收藏文章");
$(".layui-layer-tips").html('<i class="fa fa-heart-o"></i>');
}
if(data.rs==0){
//收藏成功
$(".layui-layer-tips").attr("data-tips","已收藏文章");
$(".layui-layer-tips").html('<i class="fa fa-heart"></i>')
}
})
}else{
layer.msg(data.msg)
}
} ,
//调用执行后调用的函数
complete: function(XMLHttpRequest, textStatus){
postadopt=true;
},
//调用出错执行的函数
error: function(){
//请求出错处理
postadopt=false;
}
});
}
</script>
<footer>
<div class="layui-container">
<div class="flex_box_zd">
<div class="left-footer">
<h6><a href="https://www.ucloud.cn/"><img src="https://www.ucloud.cn/yun/static/theme/ukd//images/logo.png" alt="UCloud (优刻得科技股份有限公司)"></a></h6>
<p>UCloud (优刻得科技股份有限公司)是中立、安全的云计算服务平台,坚持中立,不涉足客户业务领域。公司自主研发IaaS、PaaS、大数据流通平台、AI服务平台等一系列云计算产品,并深入了解互联网、传统企业在不同场景下的业务需求,提供公有云、混合云、私有云、专有云在内的综合性行业解决方案。</p>
</div>
<div class="right-footer layui-hidemd">
<ul class="flex_box_zd">
<li>
<h6>UCloud与云服务</h6>
<p><a href="https://www.ucloud.cn/site/about/intro/">公司介绍</a></p>
<p><a href="https://zhaopin.ucloud.cn/" >加入我们</a></p>
<p><a href="https://www.ucloud.cn/site/ucan/onlineclass/">UCan线上公开课</a></p>
<p><a href="https://www.ucloud.cn/site/solutions.html" >行业解决方案</a></p> <p><a href="https://www.ucloud.cn/site/pro-notice/">产品动态</a></p>
</li>
<li>
<h6>友情链接</h6> <p><a href="https://www.compshare.cn/?ytag=seo">GPU算力平台</a></p> <p><a href="https://www.ucloudstack.com/?ytag=seo">UCloud私有云</a></p>
<p><a href="https://www.surfercloud.com/">SurferCloud</a></p> <p><a href="https://www.uwin-link.com/">工厂仿真软件</a></p> <p><a href="https://www.picpik.ai/zh">AI绘画</a></p>
<p><a href="https://wavespeed.ai/">Wavespeed AI</a></p>
</li>
<li>
<h6>社区栏目</h6>
<p><a href="https://www.ucloud.cn/yun/column/index.html">专栏文章</a></p>
<p><a href="https://www.ucloud.cn/yun/udata/">专题地图</a></p> </li>
<li>
<h6>常见问题</h6>
<p><a href="https://www.ucloud.cn/site/ucsafe/notice.html" >安全中心</a></p>
<p><a href="https://www.ucloud.cn/site/about/news/recent/" >新闻动态</a></p>
<p><a href="https://www.ucloud.cn/site/about/news/report/">媒体动态</a></p> <p><a href="https://www.ucloud.cn/site/cases.html">客户案例</a></p>
<p><a href="https://www.ucloud.cn/site/notice/">公告</a></p>
</li>
<li>
<span><img src="https://static.ucloud.cn/7a4b6983f4b94bcb97380adc5d073865.png" alt="优刻得"></span>
<p>扫扫了解更多</p></div>
</div>
<div class="copyright">Copyright © 2012-2025 UCloud 优刻得科技股份有限公司<i>|</i><a rel="nofollow" href="http://beian.miit.gov.cn/">沪公网安备 31011002000058号</a><i>|</i><a rel="nofollow" href="http://beian.miit.gov.cn/"></a> 沪ICP备12020087号-3</a><i>|</i> <script type="text/javascript" src="https://gyfk12.kuaishang.cn/bs/ks.j?cI=197688&fI=125915" charset="utf-8"></script>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?290c2650b305fc9fff0dbdcafe48b59d";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-DZSMXQ3P9N"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-DZSMXQ3P9N');
</script>
<script>
(function(){
var el = document.createElement("script");
el.src = "https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?99f50ea166557aed914eb4a66a7a70a4709cbb98a54ecb576877d99556fb4bfc3d72cd14f8a76432df3935ab77ec54f830517b3cb210f7fd334f50ccb772134a";
el.id = "ttzz";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(el, s);
})(window)
</script></div>
</div>
</footer>
</body>
<script src="https://www.ucloud.cn/yun/static/theme/ukd/js/common.js"></script>
<<script type="text/javascript">
$(".site-seo-depict *,.site-content-answer-body *,.site-body-depict *").css("max-width","100%");
</script>
</html>