2

我正在使用 Django 编写一个应用程序,该应用程序将具有一个用于自动请求等的接口,它不会使用图形/HTML UI。截至目前,我正在使用 aModelForm来允许诸如

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)

wheresucceedfailare 生成正确响应/日志条目的函数。这部分工作正常。但是,我想编写一个类似的函数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
4

1 回答 1

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
于 2013-06-20T23:20:57.680 回答