【问题标题】:How to save changed fields with ModelForm?如何使用 ModelForm 保存更改的字段?
【发布时间】:2016-11-08 03:46:24
【问题描述】:

我想将 ModelForm 的更改值保存到数据库。如果我是对的,即使我遵循此文档,我也会遇到问题,初始值是可能的:Documentation- providing initial values

models.py:

class Settings(models.Model):
   url = models.URLField(max_length=100, default='https://website.com')
   maxCount = models.SmallIntegerField(default=30)

views.py:

def Settings(request):

    settingsObj = Settings.objects.get(id=1)
    form = SettingsForm(initial={'url': settingsObj.url, 'maxCount':settingsObj.maxCount}, instance=settingsObj)

    if form.is_valid():
        form.save()

forms.py:

class SettingsForm(forms.ModelForm):
    class Meta:
        model = Settings
        fields = ['url', 'maxCount']

模板

    <form class="form-horizontal" role="form" method="POST">{% csrf_token %}
  <div class="form-group">
    <div class="col-sm-offset-1 col-sm-6">
    {{ form.as_p }}
    </div>
  </div>
    <div class="form-group">        
      <div class="col-sm-offset-1 col-sm-6">
        <button type="submit" class="btn btn-primary btn-lg btn-block">Accept</button>
      </div>
    </div>
  </form>

当前表单显示数据库中的当前值,但不保存更改的数据。 form.is_valid() 返回 True,但 form.save() 似乎什么也没做。

【问题讨论】:

  • 我没有发现任何问题
  • 当我在“form = SettingsForm() 调用表单时删除“request.POST”时会显示值,但如果我现在更改字段值,它们不会保存到数据库中.
  • 我在您的 form 标签中看不到 action 属性。
  • @YashTewari 我不希望用户被重定向离开当前站点。这不是问题。现在我可以看到表单呈现时的值,但 ModelForm 没有保存更改的数据。
  • 只需pointing this out 以确保这不是您的问题背后的原因。可能不是。

标签: python django django-models django-forms


【解决方案1】:

调用SettingsForm() 中的initial 参数和instance 参数的用途完全相同,因为您在initial 的每个字段中单独使用instance 的字段。

save() 方法不起作用,因为您需要使用来自request.POST 的数据填充表单。

这个视图应该可以工作:

def settings(request):    
    settingsObj = Settings.objects.get(id=1)
    if request.POST:
        form = SettingsForm(request.POST, instance=settingsObj)    
        if form.is_valid():
            form.save()
    else:
        form = SettingsForm(instance=settingsObj)

    context = { ..., 'form': form, ... }
    return render(request, 'template-address', context)

【讨论】:

  • 这行得通,但是当呈现表单时,我只能获取字段的 url 值。 maxCount 字段为空,当它在数据库中有值时。这是为什么呢?
猜你喜欢
  • 1970-01-01
  • 2012-10-10
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
相关资源
最近更新 更多