2016-11-18 1 views
0

私は幅広い質問をするつもりだと思ったので、私はDjangoをよく理解し、遭遇する可能性のある同様の問題にもっと簡単に対処できます。私が持っている特定の問題は、フォームを正しくレンダリングする私の最初のformsetコードを書きましたが、ポストされたときに新しいオブジェクトが作成されないということです。Django - バグが表示されているように見えるPOSTのコードをどのようにデバッグできますか?

フォームが投稿されたことをサーバーから確認できますが、エラーは表示されませんが、データベースにデータが追加されていません(django adminとmanage.pyシェルからチェックされています)。おそらく、manage.pyシェルに投稿されたものを読むことは可能でしょうか?フォームがデータを正しく投稿したかどうかと、ビューで受け取ったかどうかを確認できるようにしたいと考えています。次に、データが正しくポストされていないか、またはビューが正しく処理していないのがわかります。

具体的な問題については、私のコードを次の場所に配置します。これは、初心者のエラーの1つで、ウィザードの1つが見つかる可能性があります。私は自分自身の目的のために、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

関連する問題