You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express竞赛表单数据回显问题求助

解决竞赛表单回显已填写内容的问题

从你的代码来看,核心问题出在表单数据与用户的关联逻辑以及数据查询、模板变量传递这几个环节上,我来一步步帮你修正:

1. 给CompetitionForm模型添加用户关联字段

目前你的CompetitionForm模型没有存储用户ID,这就导致你无法通过用户ID找到对应的表单数据。修改模型,添加一个user字段来关联用户的ObjectId:

var CompetitionFormSchema = mongoose.Schema({
  // 新增用户关联字段,绑定到用户模型
  user: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User', // 替换成你实际的用户模型名称
    required: true
  },
  schoolName: String,
  competitionDate: String,
  competitionTime: String,
  competitionVenue: String,
  competitionTotalOfStudents: Number,
  competitionTotalParticipated: Number,
  competitionTotalPersonnel: Number,
  competitionJudge1Name: String,
  competitionJudge1Telephone: String,
  competitionJudge1Email: String,
  competitionJudge2Name: String,
  competitionJudge2Telephone: String,
  competitionJudge2Email: String,
  competitionJudge3Name: String,
  competitionJudge3Telephone: String,
  competitionJudge3Email: String,
  // admin fields
  competitionRequiredPhotos: Boolean,
  competitionRequiredCertifications: Boolean
});

2. 修正GET路由:正确查询用户对应的表单

你之前用CompetitionForm.find(req.params.id)是错误的——find()接受查询条件对象且返回数组,你需要用findOne()精准查询单个用户的表单:

router.get('/dashboard/users/forms/competition-form/:id', ensureAuthenticated, (req, res) => {
  // 根据用户ID查询对应的竞赛表单
  CompetitionForm.findOne({ user: req.params.id }, function(err, competitionForm){
    if (err) {
      console.log(`Error fetching form: ${err}`);
      return res.send('Error fetching form');
    }
    // 如果没有找到表单,创建空对象避免模板报错
    const formData = competitionForm || {};
    res.render('dashboard/users/forms/competition-form.hbs', { 
      pageTitle: 'Competition Form', 
      user_id: req.params.id,
      competitionForm: formData // 将表单数据传递给模板
    });
  });
});

3. 修正POST路由:确保表单与用户绑定

之前的findOneAndUpdate没有关联用户ID,导致新创建的表单无法绑定到用户,修改如下:

router.post('/dashboard/users/forms/competition-form/:id', (req, res) => {
  CompetitionForm.findOneAndUpdate(
    { user: req.params.id }, 
    { ...req.body, user: req.params.id }, // 强制绑定当前用户ID
    { upsert:true, new: true }, // new: true 返回更新后的文档
    (err, competition) => {
      if (err) {
        console.log(`Error saving data: ${err}`);
        return res.send('Error saving data');
      }
      res.redirect('/dashboard');
      console.log(req.body);
    }
  );
});

4. 修正模板中的变量引用

现在模板里可以直接使用competitionForm对象的属性填充输入框的value:

<form action="/dashboard/users/forms/competition-form/{{user_id}}" method="post">
  <label for="schoolName">School Name <span style="color: red">*</span></label>
  <input type="text" class="form-control" name="schoolName" placeholder="Enter school name" value="{{competitionForm.schoolName}}" required>
  <!-- 其他字段同理,示例: -->
  <label for="competitionDate">Competition Date</label>
  <input type="text" class="form-control" name="competitionDate" placeholder="Enter date" value="{{competitionForm.competitionDate}}">
</form>

关键说明

  • 之前显示用户模型的schoolName,是因为你模板里用了{{user.schoolName}},而user是ensureAuthenticated中间件传递的当前登录用户对象,并非竞赛表单的数据。
  • 要确保用户模型的名称和你在CompetitionForm模型ref里写的一致,比如用户模型是User,那ref: 'User'就没问题。

内容的提问来源于stack exchange,提问作者user8331511

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:49:11