Python 如何在django中将模型表单中的数据保存到数据库中?

Python 如何在django中将模型表单中的数据保存到数据库中?,python,django,Python,Django,我有一个模型: class Cost(models.Model): project = models.ForeignKey(Project) cost = models.FloatField() date = models.DateField() 对于模型,我创建了一个ModelForm类: class CostForm(ModelForm): class Meta: model = Cost fields = ['date',

我有一个模型:

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>
我的尝试 我尝试以下一种方式实现该解决方案(注意:offset=项目名称):


但它不起作用:(

有几件事情看起来不对劲:

  • Project.objects.filter()
    将返回一个queryset。改用
    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>
    

    此外,我认为您需要将
    blank=True
    添加到
    模型中。在
    成本
    模型中添加ForeignKey(Project)
    。这将允许您的模型表单进行验证。

    我找到了解决方案。按如下所示重写
    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('/')
    
    代码的其余部分没有更改。

    我是这样做的:

    def save_model(self, request, obj, form, change):
        obj.save()
    
    要修改某些内容,请通过以下方式执行:

    obj.xyz = 'something'
    obj.save()
    
    这是相关的:。该示例非常准确。另外,请阅读以下内容:
    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('/')
    
    def save_model(self, request, obj, form, change):
        obj.save()
    
    obj.xyz = 'something'
    obj.save()