Django部分更新没有表单提交

时间:2013-06-20 22:49:07

标签: django django-models django-forms

我正在使用Django编写一个应用程序,该应用程序将具有自动请求等界面,不会使用图形/ HTML UI。截至目前,我正在使用ModelForm来允许

等请求
POST /addFoo?a=1&b=Hello

将创建包含这些字段和值的新Foo并将其添加到数据库中。视图函数看起来像

def addFoo(request):
    form = FooForm(request)
    if form.is_valid():
        foo = form.save()
        return succeed(id=foo.id)
    else:
        return fail(code=0, error=form.errors)

其中succeedfail是生成正确响应/日志条目的函数。这部分工作正常。但是,我想写一个类似的函数editFoo,这样如果有一个ID为1的对象,那么

POST /editFoo?id=1&a=42

会将该对象的a字段更改为42.我目前拥有的视图功能是

def editFoo(request):
    try:
        foo = models.Foo.objects.get(id=request['id'])
    except:
        return fail(0, error=u'No such object exists!')
    form = FooForm(request, instance=foo)
    if form.is_valid():
        form.save()
        return succeed()
    else:
        return fail(code=1, error=form.errors)

但是,当我测试此form.errors包含错误消息,表明需要指定未指定的字段。由于这些请求的启动将由客户端启动(也就是说,我无法预加载HTML <form>以供他们编辑),我似乎无法找到使这种视图工作的方法。

提前感谢您的建议。

编辑:模型和表格非常简单:

class Foo(Model):
    a = IntegerField()
    b = CharField(max_length=23)

class FooForm(ModelForm):
    class Meta:
        model = Foo

1 个答案:

答案 0 :(得分:1)

您需要使用一个表单类,该表单类只包含您希望从POST中获取的字段,或者允许省略字段,即使模型本身需要这些字段。

限制现有字段:

class FooEditForm(ModelForm):
    class Meta:
        model = Foo
        fields = ('a',)

允许省略字段:

class FooEditForm(ModelForm):
    class Meta:
        model = Foo

    a = forms.IntegerField(required=False)
    b = forms.CharField(required=False, max_length=23)

或者使用表单__init__方法编辑它们:

class FooEditForm(ModelForm):
    class Meta:
        model = Foo

    def __init__(self, *args, **kwargs):
        super(FooEditForm, self).__init__(*args, **kwargs)
        for field in self.fields.itervalues():
            field.required = False