2013-06-20 43 views
2

我正在使用Django编写一个应用程序,该应用程序将具有用于自动化请求等的界面,该界面不会使用图形/ HTML界面。截至目前,我使用的是ModelForm允许请求,如Django部分更新没有提交表单

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 
+0

写的模型和的ModelForm代码,请 – lalo

+0

没有太多的事情,但补充。 – Actorclavilis

+0

这是“b”重新调整? – lalo

回答

1

您需要使用只包含您期望从您的文章,以获得字段的表单类,或者即使它们在模型本身上是必需的,也允许字段被省略。

限制领域存在:

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 
+0

谢谢,但我不知道我期待什么字段,直到我得到它们,因为客户可以选择更改任何字段。我不认为每个请求的'modelform_factory'是最简单的方法。 – Actorclavilis

+0

在这种情况下,请通过显式声明它们并覆盖默认字段来使表单中不需要的字段。我会编辑来演示。 –

+0

谢谢,最后一个正是我期待的!我考虑了第二个,但它似乎是对DRY的一个可怕的违反(其中一些模型比较复杂)。将尝试并接受。 – Actorclavilis