2017-02-09 16 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の後にこのフィールドを設定しようとすると、フィールドを設定または取得して検証することができませんでした。

モデルインスタンスが

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

ビューに入る上で開始され、その後、フォームが生成され、私は、フォームのinitを実行したとき。私のコードはtimesheet_idを取得これは、私はこれは私がこれを行う方法がわからない

NameError: global name 'timesheet_id' is not defined

が...

私も設定しようとしてきたエラーを発生させ

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 

しようとしたものですフィールドをclean()メソッドの形式で返しますが、(印刷で表示される)値が入力されても検証されず、フォームセットエラーが発生します。

ヘルプ!

答えて

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

注意、再び、あなたは保存することを反復処理する前に、全体フォームセットの妥当性をチェックする必要があります。そうしないと、無効なフォームに遭遇する前にそれらのいくつかを保存することになります。

関連する問題