2011-06-24 130 views
3

我有一個Django ModelForm與一些初始數據傳遞給它。到目前爲止工作得很好。Django ModelForm初始數據沒有顯示在重新顯示

但是,如果用戶沒有填寫所有數據,或者犯了另一個錯誤,在重新顯示錶單時不會再查找初始值。

這裏的一個代碼段:在forms.py

class TrainingAddForm(forms.ModelForm): 
class Meta: 
    model = TrainingTasks 
    fields = ('task','ac_reg','date','wo_no') 

def __init__(self, *args, **kwargs): 
    super(TrainingAddForm, self).__init__(*args, **kwargs) 
    self.fields['task'].required = False 
    self.fields['task'].widget.attrs['disabled'] = 'disabled' 
    self.fields['date'].widget = widgets.AdminDateWidget() 

def clean_task(self): 
    return 

一種:

def add_trainingtask(request, task_id): 

if request.POST: 
    form = TrainingAddForm(request.POST) 

    if form.is_valid(): 
     tt = TrainingTasks(
      trainee = request.user, 
      task = Tasks.objects.get(pk=task_id), 
      date = form.cleaned_data['date'], 
      ac_reg = form.cleaned_data['ac_reg'], 
      wo_no = form.cleaned_data['wo_no'], 
     ) 
     tt.save() 
     return HttpResponseRedirect('/admin/tot/tasks/') 

else: 
    form = TrainingAddForm(initial = {"task": task_id}) 

return render_to_response('admin/tot/trainingtasks/add.html', { 
     'form': form, 
     'task_id': task_id 
    }, 
    context_instance = RequestContext(request) 
) 

如果用戶錯過填寫即日期(這是必須的)的形式將被重新顯示顯示錯誤(需要字段),但task_id的基礎記錄不再顯示。 ID仍然存在,還可以保存記錄(糾正錯誤後),這對用戶來說幾乎是一個令人煩惱的錯誤。

我想我錯過了一些代碼,但我無法弄清楚。

+0

問題確實沒有意義。你是否說在重新加載頁面後,'task'表單域是空的? –

+0

是的,確實發生了這種情況。 task_id仍然存在,但相關記錄將不再顯示。 – normic

回答

1

我不確定我是否理解您的表單或您的觀點的邏輯。

您已包含任務字段,但已禁用該字段。在禁用任務字段的情況下,該值不會包含在request.POST集合中。

在你看來,你傳遞的是task_id參數的形式作爲初始數據,如果request.method是一個POST,你從數據庫中檢索Task對象。

這似乎是任務是你想分配給TrainingTask的東西,但不是它不一定是你想要包含在表單中的東西。鑑於此,我會:

#forms.py 
class TrainingAddForm(forms.ModelForm): 
    class Meta: 
     model = TrainingTasks 
     fields = ('ac_reg','date','wo_no',) 
     #not include the task 

    def __init__(self, *args, **kwargs): 
     super(TrainingAddForm, self).__init__(*args, **kwargs) 
     self.fields['date'].widget = widgets.AdminDateWidget() 

#views.py 
from django.core.urlresolvers import reverse 
from django.shortcuts import get_object_or_404, render 
from your_app.forms import TrainingAddForm 
from your_app.models import Task, TrainingTasks 

def add_trainingtask(request, task_id): 
    #make sure we have a valid Task object, or redirect. 
    #you could also use a try/except Task.DoesNotExist and show an error 
    task = get_object_or_404(Task, pk=task_id) 

    form = TrainingAddForm(request.POST or None) 
    if request.POST: 
     if form.is_valid():     
      tt = TrainingTasks(
       trainee = request.user, 
       task = task, 
       date = form.cleaned_data['date'], 
       ac_reg = form.cleaned_data['ac_reg'], 
       wo_no = form.cleaned_data['wo_no'], 
      ) 
      tt.save() 
      #dont hard-code the url here 
      return HttpResponseRedirect(reverse('admin_tot_tasks')) 
    return render(request, 'admin/tot/trainingtasks/add.html', {'form': form, 
     'task' : task}) 

希望可以幫助你。

+0

對不起,可能我的問題還不清楚。 我使用Task對象向添加TrainingTaskobject的用戶顯示其背後的信息。所以我拿了task_id並從數據庫中抓取相應的記錄。 但我想阻止用戶更改選擇的任務,這就是爲什麼我禁用該字段。 – normic

+0

嗨。如果你不想讓它們改變任務對象,爲什麼要把它包含在表單數據中呢?你通過查詢字符串傳遞task_id,所以你可以通過傳遞給你的視圖的參數來獲取它。 – Brandon

+0

嗨布蘭登。因爲我想實際顯示相關任務對象中包含的信息。 但也許你是對的,我只會在模板中顯示信息。 Thx指向正確的方向。 – normic