2016-06-29 2 views
0

하루 종일이 작업을하려고했습니다. 나는 입구 인 주 모형을 가지고있다. 엔트리는 몇 가지 교대를 포함 할 수 있습니다. 이것은 근무 시간을 저장하는 앱의 일부입니다. 나는 그 말을 종료한다 변화를 눌러 저장과 항목을 입력 할 때Formset : 모델 저장이 작동하지 않습니다.

class EntryCreateView(FormView): 
    template_name = 'entry/create.html' 
    form_class = AddWorkDay 
    success_url = reverse_lazy('time_manager:index') 

    def get(self, request, ordinal=None, *args, **kwargs): 
     """ Initiates with a blank form or will populate the day field with the day represented by the passed 
      ordinal. """ 
     if ordinal: 
      day = datetime.datetime.fromordinal(int(ordinal)) 
      form = AddWorkDay(initial={'day': day}) 
     else: 
      form = AddWorkDay() 
     formset = ShiftFormSet() 

     return render(request, self.template_name, {'form': form, 'formset': formset}) 

    def post(self, request, ordinal=None, *args, **kwargs): 
     form = AddWorkDay(data=request.POST) 
     formset = ShiftFormSet(data=request.POST) 
     errors = [] 
     shifts = [] 

     if form.is_valid() and formset.is_valid(): 
      # Build entry. 
      entry  = form.save(commit=False) 
      entry.owner = request.user 
      errors.extend(entry.validate(request.user)) 

      # Build shift. 
      for form in formset: 
       shift  = form.save(commit=False) 
       shift.entry = entry 
       shifts.append(shift) 
       errors.extend(shift.validate(request.user)) 

      if len(errors) == 0: 
       entry.save() 
       for shift in shifts: 
        shift.save() 
       return HttpResponseRedirect(reverse('time_manager:index')) 

     return render(request, self.template_name, {'form': form, 'formset': formset, 'errors': errors, 'shifts': shifts, 'entry': entry}) 

: 여기에 항목을 생성하는 뷰입니다/time_manager/항목에서 "IntegrityError가// NOT NULL 제약 조건이 실패 만들 : shift_shift.entry_id ". 나는 교대가 잘못되었는지 알아 내려고 노력했기 때문에, 블록을 어디에 저장했는지 ("ifen (오류)"에서 "HttpResponseRedirect를 반환한다"), 폼이있는 뷰로 돌아갈 것이라고 주석을 달았습니다. . 그런 다음 {{shifts}}을 내 템플릿에 넣어 거기에 무엇이 있는지 확인합니다. "noReverseMatch at/time_manager/entry/create/ '()'및 키워드 인수 '{'pk ': 없음}'을 (를) 사용하여 '편집'을 취소합니다.)는 { 'url %} 태그를 사용하여 존재하지 않는 뷰를 참조하는 것처럼 ['time_manager/entry/shift/edit/(? P (\ d +))/$ '] 시도했습니다. 그래서 formset의 형식을 저장하려고 할 때 뭔가 잘못되었다고 생각합니다. 그러나, 나는 django 문서를 몇번이고 읽었고 이것은 formset의 형식을 저장하는 방법이다. 그렇지 않은가?

+1

저장을 주석 처리 했으므로 개체가 저장되지 않으므로 pk가 null이됩니다. –

+0

저장 부분이 주석 처리되지 않은 경우 null 제약 조건이 발생합니다. 나는 단지 그것을 주석 처리 했으므로 폼보기로 돌아가서 변수의 내용을 표시 할 수있었습니다. 그러나 shift의 내용을 인쇄하려고하면보기가 종료됩니다. – user2660930

+0

url 태그를 사용하는 곳에 템플릿을 표시해야합니다. –

답변

1

새 머리로 내 코드를 살펴본 후 나에게도 발생했습니다. 나는 입장과 각 교대가 첫째로 정확하게 건설되고 그들이 어떤 규칙을 위반하지 않는 경우에 그 (것)들을 저장하는 것을 확인하고 싶었다. 위에서 볼 수 있듯이 저는 commit = False로 둘 다 저장하고 있습니다. 그러나 엔트리에는 아직 기본 키가 할당되지 않았다는 것을 의미합니다. 기본 키는 내 교대 모델의 ForeignKeyField가 필요로하는 것입니다. 그래서 장고가 그것을 저장하지 못했습니다.
방법의 순서가 다소 바뀌 었습니다. 이것은 작업 코드입니다 :

def post(self, request, ordinal=None, *args, **kwargs): 
    form = AddWorkDay(data=request.POST) 
    formset = ShiftFormSet(data=request.POST) 
    errors = [] 
    shifts = [] 

    if form.is_valid() and formset.is_valid(): 
     # Build entry. 
     entry  = form.save(commit=False) 
     entry.owner = request.user 
     errors.extend(entry.validate(request.user)) 

     # Build shift. 
     for form in formset: 
      shift  = form.save(commit=False) 
      shifts.append(shift) 
      errors.extend(shift.validate(request.user)) 

     # If there are no errors, save the entry ans it's shifts. 
     if len(errors) == 0: 
      entry.save() 
      for shift in shifts: 
       shift.entry = entry 
       shift.save() 
      return HttpResponseRedirect(reverse('time_manager:index')) 

    return render(request, self.template_name, {'form': form, 'formset': formset, 'errors': errors, 'shifts': shifts, 'entry': entry}) 

두 번째 엔트리가 (commit = False가없이) 저장되고 shift로 지정되는 것에 유의하십시오.