2017-02-09 13 views
1

Я пытаюсь установить значение поля при запуске формы.Установка значения формы при запуске формы

Значение этого поля извлекается при входе в представление - вид, являющийся расписанием. Затем для каждого Time, установленного в представлении, я хочу связать его с расписанием.

@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) 

И тогда форма генерируется и я бегу форме инициализации. Так это то, что я пытался

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(), но оно заполняется (отображается печатью), а затем все еще не проверяется, и я поднимаю ошибку набора форм. «Это поле обязательно».

Помощь!

ответ

1

Фактически вы не принимаете параметр timesheet_id в методе init формы, чтобы значение не было определено, следовательно, ошибка.

Однако это неправильный подход. Нет смысла передавать значение форме, выводя ее как скрытое поле, а затем возвращая ее, когда вы все это время. Способ сделать это: исключить значение из полей формы и установить его на сохранение.

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() 

Заметьте, опять же, вы должны проверить достоверность всей formset до того перебор, чтобы сохранить; иначе вы можете сохранить некоторые из них, прежде чем столкнуться с недопустимой формой.