【问题标题】:How do I save data from a ModelForm to database in django?如何将数据从 ModelForm 保存到 django 中的数据库?
【发布时间】:2011-02-19 16:51:16
【问题描述】:

我有一个模型:

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

我的尝试

我尝试以另一种方式实现解决方案(注意:偏移量 = 项目名称):

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

但它不起作用:(

【问题讨论】:

标签: python django


【解决方案1】:

有几件事看起来不对:

  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 模型中将blank=True 添加到您的models.ForeignKey(Project)。这将允许您的 ModelForm 进行验证。

【讨论】:

    【解决方案2】:

    我找到了解决方案。改写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('/')
    

    其余代码没有变化。

    【讨论】:

      【解决方案3】:

      我是这样做的:

      def save_model(self, request, obj, form, change):
          obj.save()
      

      要修改某些内容,请通过以下方式进行:

      obj.xyz = 'something'
      obj.save()
      

      【讨论】:

        猜你喜欢
        • 2013-08-19
        • 1970-01-01
        • 2020-10-11
        • 2018-07-07
        • 2018-10-10
        • 1970-01-01
        • 2012-02-27
        • 1970-01-01
        相关资源
        最近更新 更多