在beego中处理表单提交的正确方法是什么?
问题描述:
我试图在beego中提交表单数据并将其存储到数据库中。并有一些问题:在beego中处理表单提交的正确方法是什么?
- 如何正确处理请求并将其转换为对象?
- 我应该验证请求还是转换对象?
我的控制器动作:
func (c *ServicesController) Edit() {
var err error
var id, _ = c.GetUint64(":id")
var serviceModel = models.Service{}
var service models.Service
service, err = serviceModel.FindById(id)
c.Data["Service"] = service
if err == orm.ErrNoRows || err == orm.ErrMissPK {
c.Abort("404")
}
if c.Ctx.Input.IsPost() {
err = nil
if err := c.ParseForm(&service); err != nil {
c.Abort("500")
}
serviceModel.CreateOrUpdate(service)
}
c.TplName = "services/edit.html"
}
型号:
type Service struct {
Id uint64 `form:"-"`
Name string `orm:"size(100)" valid:"Required; MaxSize(100)" form:"name"`
}
func init() {
orm.RegisterModel(new(Service))
}
func (s *Service) FindById(id uint64) (Service, error) {
o := orm.NewOrm()
service := Service{Id: id}
err := o.Read(&service)
return service, err
}
func (s *Service) CreateOrUpdate(service Service) {
o := orm.NewOrm()
o.InsertOrUpdate(&service)
}
但是,当我试图提交表单(与InsertOrUpdate
)也无妨创建新的对象,因为我没有id字段在窗体中(因为我从路由ID参数中检索对象)。我是否应该通过id来形成或如何破解它?
答
您解析表单后,只需添加ID:
if err := c.ParseForm(&service); err != nil {
c.Abort("500")
}
service.Id = id
通过beego的来源来看,我认为你可以这样做:
if c.Ctx.Input.IsPost() {
c.Input().Add("id", id)
err = nil
if err := c.ParseForm(&service); err != nil {
c.Abort("500")
}
serviceModel.CreateOrUpdate(service)
}
但如果没有,我只想调整你代码有点:
func (c *ServicesController) Edit() {
var id, _ = c.GetUint64(":id")
var service models.Service{}
var serviceModel = models.Service{}
var err error
if c.Ctx.Input.IsPost() {
if err = c.ParseForm(&service); err != nil {
c.Abort("500")
}
service.Id = id
serviceModel.CreateOrUpdate(service)
} else {
service, err = serviceModel.FindById(id)
if err == orm.ErrNoRows || err == orm.ErrMissPK {
c.Abort("404")
}
c.Data["Service"] = service
c.TplName = "services/edit.html"
}
我也想一想,但它不丑吗?我从数据库中获取对象并将表单数据应用到它。为什么它会覆盖不在表单中的ID? –
你不得不向我们展示你的'ParseForm'方法,我不知道它为什么会覆盖它的方法 – dave
这不是我的,它来自beego –