无法隐藏表单字段(管理员评论)

表单

#1

问题:管理员登录后 想要隐藏的评论表单字段无法隐藏

1.这是管理员的评论表单图,前三个想要隐藏,但隐藏不了

2.这是表单类:

# 游客评论表单
class CommentForm(FlaskForm):
    author = StringField("姓名/昵称",validators=[DataRequired(message="无效数据"),Length(1,20,message="姓名或昵称长度在1到20位之间")],render_kw={"placeholder":"请输入姓名/昵称"})
    email = StringField("邮箱",validators=[DataRequired(message="无效数据"),Length(1,254,message="邮箱长度不符"),Email(message="邮箱格式错误")],render_kw={"placeholder":"请输入邮箱"})
    site = StringField("网址",validators=[Optional(),Length(0,254,message="网址长度过长"),URL("网址格式错误")],render_kw={"placeholder":"请输入网址(可以不填)"})
    body = TextAreaField("评论内容",validators=[DataRequired("数据无效")])
    submit = SubmitField("发表")

# 管理员评论表单
class AdminCommentForm(CommentForm):
    author = HiddenField()
    email = HiddenField()
    site = HiddenField()

3.这是视图函数
```

# 发表评论
if current_user.is_authenticated:
    comment_form = AdminCommentForm()
    reviewed = True
    from_admin = True
else:
    comment_form = CommentForm()
    reviewed = False
    from_admin = False

if comment_form.validate_on_submit():
    author = comment_form.author.data
    email = comment_form.email.data
    site = comment_form.site.data
    body = comment_form.body.data

    comment = Comment(author=author,email=email,site=site,body=body,reviewed=reviewed,from_admin=from_admin,post_id=post_id)
    db.session.add(comment)
    db.session.commit()
    return redirect(url_for("blog.post",post_id=post_id))
return render_template("blog/post.html",post=post,pagination=pagination,comments=comments,comment_form=comment_form)

4.这是前端
        <form action="{{ url_for("blog.post",post_id=post.id) }}" method="post" style="width:500px;">
            {{ comment_form.csrf_token }}
            {{ field_form(comment_form.author,type="text" ,class="form-control") }}
            {{ field_form(comment_form.email,type="text" ,class="form-control") }}
            {{ field_form(comment_form.site,type="text" ,class="form-control") }}
            {{ field_form(comment_form.body,class="form-control",rows="3") }}
            {{ field_form(comment_form.submit,type="submit",class="btn btn-default") }}
        </form>

#2

HiddenField() 成功隐藏的前提是该字段已经得到了所需的值,只是在用户界面的层面被隐藏,无法被肉眼看到而已。而既然你的表单字段有 DataRequired() 验证器,但你并没有给管理员表单的这三个字段预先提供值,这大概是导致隐藏字段没有成功隐藏的原因,建议你看一下书中 8.2 节中类似案例所渲染出的HTML源码,再对比一下你这个案例中渲染出的HTML源码。


#3

注意你渲染表单的代码:

{{ field_form(comment_form.author,type="text" ,class="form-control") }}

隐藏字段 <input> 元素的 type 属性是 hidden,你手动设置成 text 了,删掉多余的三处 type="text",即:

{{ field_form(comment_form.author, class="form-control") }}

不太清楚你的 field_form 宏是怎么定义的,但猜测它会自动处理 type 属性,不用额外传入这个参数。


#4

辉哥,去掉type把输入框隐藏了,但是label还会存在,怎么把label也隐藏呢,我表单渲染宏里写了label,如果删掉的话,匿名用户评论也没有label了

{# 表单的字段宏 #}
{% macro field_form(field) %}
    {{ field.label }}
    {{ field(**kwargs) }}
    {% if field.errors %}
        {% for error in field.errors %}
            <smal>{{ error }}</smal>
        {% endfor %}
    {% endif %}
    <br>
{% endmacro %}

#5

想起来了,直接调用 WTForms 内置的 hidden_tag() 方法可以一次渲染所有隐藏字段:

{{ form.hidden_tag() }}

用上面这行替代你代码里的这三行:

{{ comment_form.csrf_token }}
{{ field_form(comment_form.author,type="text" ,class="form-control") }}
{{ field_form(comment_form.email,type="text" ,class="form-control") }}
{{ field_form(comment_form.site,type="text" ,class="form-control") }}