나는 광범위한 질문을 던져 장고에 대해 더 잘 이해할 수있을 것이라고 생각했고 내가 만날 수있는 비슷한 문제를 더 쉽게 다룰 수 있었다. 내가 겪고있는 특정 문제는 양식을 올바르게 렌더링하는 첫 번째 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)
로깅 명령문을보기 코드에 추가하십시오. –
'concept = concept_form.save''.save()'(괄호 사용)라고 말하고 싶습니까? 그렇지 않으면 save 메소드를 다시 호출하지만 _ 호출하지는 않습니다. –
@JohnGordon 그 점을 발견해 주셔서 감사합니다 (errors_spotted_by_django_wizards + = 1). 당신은 정확하고 나는 그것을 편집했습니다. 그러나 여전히 양식 제출시 데이터베이스에 저장되는 데이터가 없기 때문에 이것이 유일한 오류는 아닌 것 같습니다. 로깅 진술에 대해 더 자세히 알려주시겠습니까? 이 기능을 알지 못합니다. 아마도 나를 향해 지시 할 수있는 문서가 있을까요? – Era