2011-06-24 60 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