2017-02-09 12 views
1

我尝试在表单启动时设置一个字段值。当表单启动时设置表单值

当我们进入视图时,这个字段的值被检索 - 视图是时间表。然后,对于视图中设置的每个时间,我想将其关联回时间表。

@login_required 
@requires_csrf_token 
def timesheet(request, timesheet_id): 
    timesheet = TimeSheet.objects.get(pk=timesheet_id) 
    NewTimeFormSet = modelformset_factory(Time, form=TimeForm, formset=RequiredFormSet) 
    if request.method == 'POST': 
     newtime_formset = NewTimeFormSet(request.POST, request.FILES) 
     for form in newtime_formset: 
      if form.is_valid(): 
       form.save() 

    #then render template etc 

所以,为了确保窗体验证我想在表单启动时设置这个字段。当我在视图中尝试在POST后设置此字段时,我无法获取要设置或验证的字段。

我的代码获取timesheet_id当模型实例在进入视图

def __init__(self, *args, **kwargs): 
     # this allows it to get the timesheet_id 
     print "initiating a timesheet" 
     super(TimeSheet, self).__init__(*args, **kwargs) 

,然后生成的表单开始,我跑的形式INIT。所以这是我已经试过

class TimeForm(forms.ModelForm): 

    class Meta: 
     model = Time 
     fields = ['project_id', 'date_worked', 'hours', 'description', 'timesheet_id',] 

      # some labels and widgets, the timesheet_id has a hidden input 

    def __init__(self, *args, **kwargs): 
     print "initiating form" 
     super(TimeForm, self).__init__(*args, **kwargs) 
     timesheet = TimeSheet.objects.get(id=timesheet_id) 
     self.fields['timesheet_id'] = timesheet 

这就提出了一个错误

NameError: global name 'timesheet_id' is not defined

我不知道如何做到这一点?

我也试图设置字段在形式为clean()方法,但它填充(显示一个打印),然后仍然不验证,我提出一个formset错误'此字段是必需的'。

帮助!

回答

1

您实际上并不接受init方法的形式的timesheet_id参数,因此没有定义值,因此错误。

但是,这是错误的方法。没有必要将价值传递给表单,将其作为隐藏字段输出,然后将其恢复到原来的状态。执行此操作的方法是将排除在表格字段中的值,并将其设置为保存。

class TimeForm(forms.ModelForm): 

    class Meta: 
     model = Time 
     fields = ['project_id', 'date_worked', 'hours', 'description',] 

...

if request.method == 'POST': 
    newtime_formset = NewTimeFormSet(request.POST, request.FILES) 
    if newtime_formset.is_valid(): 
     for form in newtime_formset: 
      new_time = form.save(commit=False) 
      new_time.timesheet_id = 1 # or whatever 
      new_time.save() 

注意,同样,你应该检查整个表单集的有效性,通过保存迭代前;否则在遇到无效表单之前,您最终可能会保存其中的一部分。