2012-04-18 79 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