如何使用ModelForm保存更改的字段?

时间:2016-07-06 07:08:44

标签: python django django-models django-forms

我想将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()似乎什么都不做。

1 个答案:

答案 0 :(得分:1)

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

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)