如何在Django中将ModelForm的数据保存到数据库?
我有一个模型:
class Cost(models.Model):
project = models.ForeignKey(Project)
cost = models.FloatField()
date = models.DateField()
为了这个模型,我创建了一个 ModelForm
类:
class CostForm(ModelForm):
class Meta:
model = Cost
fields = ['date', 'cost']
在 view.py
文件里:
def cost(request, offset):
if request.method == 'POST':
# NOTE: How to save the data in DB?
return HttpResponseRedirect('/')
else:
form = CostForm()
还有接下来的模板:
<form action="/cost/{{ project }}/" method="post" accept-charset="utf-8">
<label for="date">Date:</label><input type="text" name="date" value={{ current_date }} id="date" />
<label for="cost">Cost:</label><input type="text" name="cost" value="0" id="cost" />
<p><input type="submit" value="Add"></p>
</form>
问题
我该如何把表单中的数据保存到数据库里呢?
一些额外的信息:
model.py
包含:
class Project(models.Model):
title = models.CharField(max_length=150)
url = models.URLField()
manager = models.ForeignKey(User)
timestamp = models.DateTimeField()
我的尝试
我试着用以下方式来实现解决方案(注意:offset = 项目名称):
def cost(request, offset):
if request.method == 'POST':
form = CostForm(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.project = Project.objects.filter(title=offset)
instance.date = request.date
instance.cost = request.cost
instance.save()
return HttpResponseRedirect('/')
else:
form = CostForm()
但是它没有成功 :(
3 个回答
1
我这样做的:
def save_model(self, request, obj, form, change):
obj.save()
要修改某些东西,可以通过以下方式:
obj.xyz = 'something'
obj.save()
14
有几个地方看起来不太对:
Project.objects.filter()
会返回一个查询集。你应该用Project.objects.get()
,这样它只会返回一个单独的Project
对象。你不需要明确设置成本和日期,这些会通过
instance=form.save(commit=False)
来处理。你在模板中没有使用这个表单……
试试这个:
模板:
<form action="/cost/{{ project }}/" method="post" accept-charset="utf-8">
{{form.as_p}}
<p><input type="submit" value="Add"></p>
</form>
视图:
def cost(request, offset):
if request.method == 'POST':
form = CostForm(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.project = Project.objects.get(title=offset)
instance.save()
return HttpResponseRedirect('/')
else:
form = CostForm()
render_to_response('path/to/template.html',{'form':form},context_instance=RequestContext(request))
另外,我觉得你需要在 Cost
模型中的 models.ForeignKey(Project)
后面加上 blank=True
。这样可以让你的 ModelForm 验证通过。
10
我找到了解决办法。把 view.py
文件重写成了下面这样:
def cost(request, offset):
if request.method == 'POST':
project = Project.objects.get(title=offset)
date = request.POST.get('date', '')
cost = request.POST.get('cost', '')
cost_obj = Cost(project=project, date=date, cost=cost)
cost_obj.save()
return HttpResponseRedirect('/')
其他的代码没有改变。