2012-04-18 83 views
2

型号:Django的 - 一个更新的的ModelForm某些领域

class Session(models.Model): 
    tutor = models.ForeignKey(User) 
    start_time = models.DateTimeField() 
    end_time = models.DateTimeField() 
    status = models.CharField(max_length=1) 

形式:

class SessionForm(forms.ModelForm): 
    class Meta: 
    model = Session 
    exclude = ['tutor'] 

测试:

>>> ses = Session.objects.get(pk=1) 
>>> ses 
<Session: Robert - 2012-04-18 13:00:00> 
>>> form = SessionForm(instance=ses) 

现在比如我想只有更新status并保存。
我该怎么做?


编辑

模板:

<form action="fhjsdhkl" method="POST">{{ csrf_token }} 
    <input name="start_time" /> 
    <input name="end_time" /> 
</form> 

尝试后只有这2个字段:

if request.method == 'POST': 
    form = SessionForm(request.POST) 
    if request.POST['id']: 
    try: 
     s = Session.objects.get(pk=request.POST['id']) 
     form.instance = s 
    except Session.DoesNotExist: 
     pass 
    if form.is_valid(): 
    form.save() 

会话不能因为数据没被改变没有验证。

的形式返回的错误是

状态 - 这是必须填写

,我需要更新不固定的领域,我想避免发布所有的领域每次。我必须为每种情况制作不同的表格吗?

+1

为什么你需要表格? – 2012-04-18 14:43:41

+0

我只举一个例子,但我实际上是从一个模板做多个字段

2012-04-18 15:02:41

+0

你会得到什么验证错误? – San4ez 2012-04-18 15:06:21

回答

2

编辑2:旧的答案是不相关的

if request.method == 'POST': 
    form = SessionForm(request.POST) 
    if request.POST['id']: 
    try: 
     s = Session.objects.get(pk=request.POST['id']) 
     form.instance = s 
    except Session.DoesNotExist: 
     pass 
    if form.is_valid(): 
    form.save() 

好吧,你有会一些东西放在这里:

1.

此行应该是这样的:

form = SessionForm(request.POST, instance = s) 

2.

如果你做的尝试

if request.method == 'POST': 
    s = get_object_or_404(Session, pk=request.POST['id']) 
    form = SessionForm(request.POST, instance = s) 

和除下面的方法,你将引发验证错误每当对象不存在:

您应该移动会话对象了。抛出404代替。文档位于上述快捷方式中:https://docs.djangoproject.com/en/1.0/topics/http/shortcuts/#get-object-or-404如果您还没有,则需要导入它。

现在你可以valuidate它并将其保存:

if request.method == 'POST': 
    s = get_object_or_404(Session, pk=request.POST['id']) 
    form = SessionForm(request.POST, instance = s) 
    if form.is_valid(): 
     form.save() 

3.

而且,你不应该这样做:如果request.POST [ '身份证']作为字符串决不会为假,即使空的字符串。例如,在IDLE中试试这个:

>>> '' == True 
>>> '' == False 

>>> 'a' == True 
>>> 'a' == False 

你会注意到这总是计算为False。

所以,你看到的是从来没有真正创建参考模型。

+0

我只给一个例子只在一个领域,但我实际上是从模板发送多个(我没有-1) – 2012-04-18 14:45:43

+0

@PierredeLESPINAY我有一个轻微的错误,我纠正了。这可能就是为什么我ne。不前。无论如何,我做了一些编辑。 – 2012-04-18 14:48:11

+0

我也改变了我的评论:) – 2012-04-18 14:48:45