如何在Django中将ModelForm的数据保存到数据库?

17 投票
3 回答
39752 浏览
提问于 2025-04-15 22:43

我有一个模型:

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

有几个地方看起来不太对:

  1. Project.objects.filter() 会返回一个查询集。你应该用 Project.objects.get(),这样它只会返回一个单独的 Project 对象。

  2. 你不需要明确设置成本和日期,这些会通过 instance=form.save(commit=False) 来处理。

  3. 你在模板中没有使用这个表单……

试试这个:

模板:

<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('/')

其他的代码没有改变。

撰写回答