Scenario of my project – There are different casestudies, each casestudies has different parts which will appear in accordions, now i have designed the database and its generating dynamic accordions with respect to the number of my data entries.
Each part (accordion) has two column , first ccolumn for text data second column is for media data.
Each part has different format of data, how to fetch the data into this single template ?
MODELS
# Create your models here.
class CaseStudy_List(models.Model):
CaseStudy_id = models.IntegerField(primary_key=True)
title = models.CharField(max_length=255)
def __str__(self):
return self.title
class CaseStudy_Parts(models.Model): #accordians
case_study = models.ForeignKey(CaseStudy_List, on_delete=models.CASCADE)
CaseStudy_part_id = models.AutoField(primary_key=True)
CaseStudy_order = models.IntegerField(default="")
CaseStudy_title_accordian = models.CharField(max_length=255)
def __str__(self):
return self.CaseStudy_title_accordian
class CaseStudy_Content(models.Model): #column 1 - text area
case_study_part = models.ForeignKey(CaseStudy_Parts, on_delete=models.CASCADE, null=True)
content_title = models.CharField(max_length=255, default="")
content_text = models.TextField(blank=True)
content_link = models.TextField(blank=True)
def __str__(self):
return self.content_title
class CaseStudy_Media(models.Model): #column 2 - Media Area
case_study_part = models.ForeignKey(CaseStudy_Parts, on_delete=models.CASCADE, null=True)
# case_study = models.ForeignKey(CaseStudy_List, on_delete=models.CASCADE)
content_img = models.ImageField(upload_to='casestudy/images', default="")
class CaseStudy_Buttons(models.Model):
content = models.ForeignKey(CaseStudy_Content, on_delete=models.CASCADE)
button_id = models.CharField(max_length=255)
button_label = models.CharField(max_length=255)
VIEWS
def casestudy(request, CaseStudy_id ):
casestudy_object = get_object_or_404(CaseStudy_List, CaseStudy_id = CaseStudy_id) #for list
casestudy_parts_obj = CaseStudy_Parts.objects.filter(case_study=casestudy_object).order_by('CaseStudy_order').distinct() #for accordians
parts_data = [] #storing in a singlist to avoid duplicacy
for part in casestudy_parts_obj:
part_content = CaseStudy_Content.objects.filter(case_study_part = part)
part_media = CaseStudy_Media.objects.filter(case_study_part = part)
parts_data.append({
'part': part,
'content': part_content,
'media': part_media
})
context = {
'casestudy_object': casestudy_object,
'parts_data': parts_data,
}
return render(request, 'casestudy.html', context)
HTML
<div class="page-layout">
<div class="accordion" id="accordionPanelsStayOpenExample">
{% for part_data in parts_data %}
<div class="accordion-item">
<h6 class="accordion-header" id="heading{{ part_data.part.CaseStudy_part_id }}">
<button class="accordion-button {% if not forloop.first %}collapsed{% endif %}" type="button"
data-bs-toggle="collapse" data-bs-target="#collapse{{ part_data.part.CaseStudy_part_id }}"
aria-expanded="{% if forloop.first %}true{% else %}false{% endif %}"
aria-controls="collapse{{ part_data.part.CaseStudy_part_id }}">
{{ part_data.part.CaseStudy_title_accordian }}
</button>
</h6>
<!-- <div id="panelsStayOpen-{{ part_data.part.CaseStudy_part_id }}" class="accordion-collapse collapse show"> -->
<div id="collapse{{ part_data.part.CaseStudy_part_id }}"
class="accordion-collapse collapse {% if forloop.first %}show{% endif %}"
aria-labelledby="heading{{ part_data.part.CaseStudy_part_id }}">
<div class="accordion-body">
<div class="container-area">
<div class="col-content">
<div class='introduction-content'>
<h3>CASESTUDY ID - {{casestudy_object.CaseStudy_id}} </h3><br>
<h3>TITLE - {{ casestudy_object.title }} </h3> <br>
{% for content in part_data.content %}
<h3>OBJECTIVE - {{ content.content_text|safe }}</h3>
{% endfor %}
</div>
</div>
<div class="col-data">
<img src="{{media.content_img.url}}">
</div>
</div>
</div>
</div>
</div>
{%endfor%}
</div>
</div>
PLEASE HELP, THANK YOU…
I am asking my doubts here on stackoverflow, and i am so grateful to all of you, thank you so much.