2016-11-18 4 views
0

나는 광범위한 질문을 던져 장고에 대해 더 잘 이해할 수있을 것이라고 생각했고 내가 만날 수있는 비슷한 문제를 더 쉽게 다룰 수 있었다. 내가 겪고있는 특정 문제는 양식을 올바르게 렌더링하는 첫 번째 formset 코드를 작성했지만 게시 할 때 새로운 개체가 생성되지 않는다는 것입니다.Django - 버그가보기에있는 것처럼 보이는 POST 코드를 어떻게 디버깅 할 수 있습니까?

양식이 게시되었다는 것을 서버에서 볼 수 있지만 오류는 발생하지 않지만 데이터베이스에 데이터가 추가되지 않았습니다 (django admin 및 manage.py 쉘에서 확인). 아마도 manage.py 쉘에 게시 된 것을 읽을 수 있습니까? 양식이 데이터를 올바르게 게시했는지 여부를 확인할 수 있기를 원합니다. 그런 다음 데이터가 올바르게 게시되지 않거나보기가 올바르게 처리하지 않는 이유를 확인할 수 있습니다.

특정 문제에 대해서는 아래의 코드를 삽입하십시오. 마법사가 쉽게 찾아 볼 수있는 초보자 용 오류 일 수도 있습니다. 나는 내 자신의 목적을 위해 this tutorial을 따르고 적응하려고 노력했다.

Models.py

class Chunk(models.Model): 
    name = models.CharField(max_length=250) 
    text = models.CharField(max_length=500) 
    images = models.FileField() 
    question = models.CharField(max_length=250) 
    expected_completion_time = models.IntegerField(default=1) 
    keywords = models.CharField(max_length=250, blank=True, null=True) 
    topic = models.CharField(max_length=250, blank=True, null=True) 
    course = models.CharField(max_length=250, blank=True, null=True) 
    is_flagged = models.BooleanField(default=False) 

    def get_absolute_url(self): 
     return reverse('detail', kwargs={'pk':self.pk}) 

    def __str__(self): 
     return self.name 


class Concept(Chunk): 
    application = models.CharField(max_length=500) 

    @property 
    def mode(self): 
     return "concept" 


class Subconcepts(models.Model): 
    subconcept = models.CharField(max_length=500) 
    concept = models.ForeignKey(Concept, on_delete=models.CASCADE) 

    def __str__(self): 
     return self.concept.name + ' - Subconcept' 

forms.py는

class ConceptForm(forms.ModelForm): 
    # Form for creating Concept objects 
    class Meta: 
     model = Concept 
     fields = ['application', 'name', 'text', 'images', 'question', 'expected_completion_time', 'keywords', 'topic', 'course'] 


class SubconceptForm(forms.ModelForm): 
    # Form for creating Subconcept objects which are linked by ManyToOne fields to Concept objects 
    class Meta: 
     model = Subconcepts 
     fields = ['subconcept'] # Concept field excluded as will be set in view on form submission 


class BaseSubconceptFormset(BaseFormSet): 
    def clean(self): 
     # Validate that all subconcepts are unique 
     if any(self.errors): 
      return 
     subconcepts = [] 
     duplicates = False 

     for form in self.forms: 
      if form.cleaned_data: 
       subconcept = form.cleaned_data('subconcept') 

       if subconcept: 
        if subconcept in subconcepts: 
         duplicates = True 
        subconcepts.append(subconcept) 

       if duplicates: 
        raise forms.ValidationError(
         'Each key feature must be unique', 
         code='duplicate_subconcept' 
        ) 

views.py

def testformsets(request): 

    # Forms for creating a concept with appropriate subconcepts 
    SubconceptFormset = formset_factory(SubconceptForm, formset=BaseSubconceptFormset) 

    if request.method == 'POST': 
     concept_form = ConceptForm(request.POST) 
     subconcept_formset = SubconceptFormset(request.POST) 

     if concept_form.is_valid() and subconcept_formset.is_valid(): 
      concept = concept_form.save() 

      new_subconcepts = [] 

      for subconcept_form in subconcept_formset: 
       subconcept = subconcept_form.cleaned_data.get('subconcept') 
       new_subconcepts.append(Subconcepts(subconcept=subconcept, concept=concept)) 

      try: 
       with transaction.atomic(): 
        # Add all new subconcepts at once 
        Subconcepts.objects.bulk_create(new_subconcepts) 

        # And notify our users that it worked 
        messages.success(request, 'You have added new material') 

      except IntegrityError: # If the transaction failed 
       messages.error(request, 'There was an error saving your concept.') 
       return redirect('pomodoro/index.html') 

    else: 
     concept_form = ConceptForm() 
     subconcept_formset = SubconceptFormset() 

    context = { 
     'concept_form': concept_form, 
     'subconcept_formset': subconcept_formset 
    } 
    return render(request, 'pomodoro/formset_test.html', context) 
+0

로깅 명령문을보기 코드에 추가하십시오. –

+2

'concept = concept_form.save''.save()'(괄호 사용)라고 말하고 싶습니까? 그렇지 않으면 save 메소드를 다시 호출하지만 _ 호출하지는 않습니다. –

+0

@JohnGordon 그 점을 발견해 주셔서 감사합니다 (errors_spotted_by_django_wizards + = 1). 당신은 정확하고 나는 그것을 편집했습니다. 그러나 여전히 양식 제출시 데이터베이스에 저장되는 데이터가 없기 때문에 이것이 유일한 오류는 아닌 것 같습니다. 로깅 진술에 대해 더 자세히 알려주시겠습니까? 이 기능을 알지 못합니다. 아마도 나를 향해 지시 할 수있는 문서가 있을까요? – Era

답변

0

코드에 로깅 문을 추가합니다. 시작하기 좋은 곳은 모든 결정의 결과와 모든 중요한 함수 호출의 결과를 다음과 같이 로그하는 것입니다.

def myView(request): 

    import logging 
    logging.basicConfig(filename='mylog.log', level=logging.DEBUG) 

    if request.method == 'POST': 
     logging.debug('request.method=POST') 
     form = MyForm(request.POST) 
     logging.debug('form=%s', form) 

     if concept_form.is_valid(): 
      logging.debug('form is valid') 
      myform = form.save() 
      logging.debug('called form.save(), result=%s', myform) 

     else: 
      logging.debug('form is not valid') 
    else: 
     logging.debug('request.method is not POST') 
+0

고마워요.이게 내가 필요로하는 바로 그거야. 그것은 내 오류가 어디에 있는지를 보여주었습니다. 이제 해결 방법을 찾아야합니다. 다시 한번 감사드립니다. – Era