Я пытаюсь сделать inlineforms через django. Я сделал модель для сохранения загруженного изображения. К сожалению, изображение не загружается через форму. Я не могу отследить, почему изображение не сохраняется в папке.
models.py - этот файл содержит все модели.
class courses(models.Model):
name = models.CharField(max_length = 50)
class topics(models.Model):
name = models.CharField(max_length = 50)
sno = models.PositiveIntegerField(default = 0)
course = models.ForeignKey(courses,on_delete = models.CASCADE,null = True)
class sub_topics(models.Model):
name = models.CharField(max_length = 50)
content = models.TextField(null = True)
sno = models.PositiveIntegerField(default = 0)
image = models.ImageField(upload_to=('images/'),blank= True,null = True)
topic = models.ForeignKey(topics,on_delete = models.CASCADE,null = True)
forms.py - в этом файле через inlineformset_factory я сделал курсы -> тематику -> структуру базы данных sub_topics. Sno используется для хранения серийного номера дочерних форм
TopicFormset = inlineformset_factory(courses, topics, fields=('name','sno'),extra =1,widgets = {'sno': HiddenInput()})
Sub_TopicFormset = inlineformset_factory(topics, sub_topics, fields=('name','content','sno','image'),extra = 1,widgets = {'sno': HiddenInput()})
views.py - В этом файле я использовал CreateView для отображения созданных форм. При сохранении результатов курс и темы сохраняются, но при сохранении подтемы c сохраняется только ввод символов. Изображение не сохраняется даже после загрузки изображения. Изображение также не сохраняется в папке media / images.
class Create_Course_View(CreateView):
model = courses
form_class = CourseForm
template_name = 'create/add.html'
success_url = 'create/add.html'
def form_valid(self, form):
result = super(Create_Course_View, self).form_valid(form)
topic_formset = TopicFormset(form.data, instance=self.object, prefix='topic_formset')
if topic_formset.is_valid():
topics = topic_formset.save()
topics_count = 0
for topic in topics:
sub_topic_formset = Sub_TopicFormset(form.data, instance = topic, prefix='sub_topic_formset_%s'% topics_count)
x = sub_topic_formset.cleaned_data
print(x[0])
if sub_topic_formset.is_valid():
sub_topic_formset.save()
topics_count += 1
return result
def get_context_data(self, **kwargs):
context = super(Create_Course_View, self).get_context_data(**kwargs)
context['topic_formset'] = TopicFormset(prefix='topic_formset')
context['sub_topic_formset'] = Sub_TopicFormset(prefix='sub_topic_formset_0')
return context
class upload_image(CreateView):
model = image
form_class = Upload
template_name = 'create/upload.html'
def form_valid(self, form):
result = super(upload_image, self).form_valid(form)
return result
def get_context_data(self, **kwargs):
context = super(upload_image, self).get_context_data(**kwargs)
return context
add. html
<h1>Add Course</h1>
<form action="" method="post" enctype="multipart/form-data" >
{% csrf_token %}
{{ form.as_p }}
<div id="topics">
{{ topic_formset.management_form }}
{% for form in topic_formset %}
<fieldset class="topic_form">
<legend>Topic</legend>
{{ form.as_p }}
<div class="topic_sub_topics">
{{ sub_topic_formset.management_form }}
{% for form in sub_topic_formset %}
<fieldset class="topic_sub_topic_form">
<legend>Sub Topic</legend>
{{ form.as_p }}
</fieldset>
{% endfor %}
</div>
<p><input type="button" value="Add Sub Topic" class="btn_add_sub_topic" id="topic-{{ forloop.counter0 }}"/></p>
</fieldset>
{% endfor %}
</div>
<p><input type="button" id="btn_add_topic" value="Add Topic"/></p>
<p><input type="submit" value="Save"></p>
</form>