我正在使用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)
其中succeed
和fail
是生成正确响应/日志条目的函数。这部分工作正常。但是,我想写一个类似的函数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
答案 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