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
相关产品推荐
相关产品推荐

