htmldjangodatabasefetch

How to fetch different data into different sections in HTML?


I have a page on which there are different bootstrap accordians. I have different models stored in the database, Now I want to fetch them in proper order.

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 = models.ForeignKey(CaseStudy_list, on_delete=models.CASCADE)
                
                    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 = 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)


<div class="page-layout">
    <div class="accordion" id="accordionPanelsStayOpenExample">
      
      <div class="accordion-item">
        <h6 class="accordion-header">
          <button class="accordion-button" type="button" data-bs-toggle="collapse"
            data-bs-target="#panelsStayOpen-collapseOne" aria-expanded="true"
            aria-controls="panelsStayOpen-collapseOne">
            
            {{content.section_title}}
          </button>
        </h6>
        <div id="panelsStayOpen-collapseOne" class="accordion-collapse collapse show">
          <div class="accordion-body">
            <div class="container-area">
              <div class="col-content">
                <div class='introduction-content'>
                  <h3>CASESTUDY ID - {{casestudy_obj.id}} </h3><br>
                  <h3>TITLE - {{ casestudy_obj.title }} </h3> <br>
                  
                  <h3>OBJECTIVE - {{content.content_text}}</h3>
                </div>
              </div>
              <div class="col-data">
                

                <img src="{{content.content_img.url}}">
              
              </div>
            </div>
          </div>
        </div>
      </div>
   
      <div class="accordion-item">
        <h2 class="accordion-header">
          <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
            data-bs-target="#panelsStayOpen-collapseTwo" aria-expanded="false"
            aria-controls="panelsStayOpen-collapseTwo">
            DATA COLLECTION
          </button>
        </h2>
        <div id="panelsStayOpen-collapseTwo" class="accordion-collapse collapse">
          <div class="accordion-body">
            <div class="container-area">
              <div class="col-content">
                <div class='introduction-content'>
                  <h2>DATA COLLECTION </h2>

                  <h2>Hello
                  </h2>
                  <button type="button" class="process-btn btn btn-info">LOAD DATA</button>
                  <h3 id="time-taken">Time Taken : ________ </h3>
                  <h3 id="time-taken">Data Size : ________ </h3>
                </div>
              </div>
              <div class="col-data">
                <img src="{% static 'images/iris-full-img.png' %}">
                
              </div>
            </div>
          </div>
        </div>
      </div>
  </div>
</div>
def casestudy(request, CaseStudy_id ):
    casestudy_object = get_object_or_404(CaseStudy_list, CaseStudy_id = CaseStudy_id)
    casestudy_part = CaseStudy_parts.objects.filter(case_study=casestudy_object).order_by('CaseStudy_order')
    context = {
        'casestudy_object': casestudy_object,
        'casestudy_part': CaseStudy_parts,
    }
    return render(request, 'casestudy.html', context)

There are different case studiess, each case study redirect to a new page where there is information stored in accordians; these accordians may be very different in numbers for different case studies.

Now I want to know, in order to fetch data, I have to make objects for every table. And how do you show the data stored in different tables?

This is my first django project, please help


Solution

  • I believe that you are mixing database modeling with markup and CSS concepts and overcomplicating things.

    Also, before I give you a solution I would like to point out that naming conventions are a good practice. Often, PascalCase for classes and snake_case for functions and variables.

    models.py

    class Case(models.Model):
        id = models.BigAutoField(primary_key=True)
        title = models.CharField(max_length=255)
        objective = models.TextField(blank=True)
    
    
    class CaseStudy(models.Model):
        case = models.ForeignKey(Case, on_delete=models.CASCADE, related_name="studies")
        title = models.CharField(max_length=255, default="")
        order = models.IntegerField(default="")
        img = models.ImageField(upload_to="casestudy/images", default="")
    

    views.py

    def case_detail(request, pk):
        case = Case.objects.get(pk=pk)
        return render(request, "case/detail.html", {"case": case})
    

    case/detail.html

    <div class="page-layout">
      <div class="accordion" id="accordionPanelsStayOpenExample">
        <div class="accordion-item">
          <h6 class="accordion-header">
            <button
              class="accordion-button"
              type="button"
              data-bs-toggle="collapse"
              data-bs-target="#panelsStayOpen-collapseOne"
              aria-expanded="true"
              aria-controls="panelsStayOpen-collapseOne"
            >
              {{content.section_title}}
            </button>
          </h6>
    
          <div
            id="panelsStayOpen-collapseOne"
            class="accordion-collapse collapse show"
          >
            <div class="accordion-body">
              <div class="container-area">
                <div class="col-content">
                  <div class="introduction-content">
                    <h3>CASESTUDY ID - {{case.id}}</h3>
                    <br />
                    <h3>TITLE - {{ case.title }}</h3>
                    <br />
    
                    <h3>OBJECTIVE - {{case.objective}}</h3>
                  </div>
                </div>
                <div class="col-data">
                  <img src="{{content.content_img.url}}" />
                </div>
              </div>
            </div>
          </div>
        </div>
    
        {% for study in case.studies.all|dictsort:"order" %}
        <div class="accordion-item">
          <h2 class="accordion-header">
            <button
              class="accordion-button collapsed"
              type="button"
              data-bs-toggle="collapse"
              data-bs-target="#panelsStayOpen-{{study.id}}"
              aria-expanded="false"
              aria-controls="panelsStayOpen-{{study.id}}"
            >
              {{study.title}}
            </button>
          </h2>
    
          <div
            id="panelsStayOpen-{{study.id}}"
            class="accordion-collapse collapse"
          >
            <div class="accordion-body">
              <div class="container-area">
                <div class="col-content">
                  <div class="introduction-content">
                    <h2>{{study.title}}</h2>
                    <button type="button" class="process-btn btn btn-info">
                      LOAD DATA
                    </button>
                    <h3 id="time-taken">Time Taken : ________</h3>
                    <h3 id="time-taken">Data Size : ________</h3>
                  </div>
                </div>
                <div class="col-data">
                  <img src="{{study.img.url}}" />
                </div>
              </div>
            </div>
          </div>
        </div>
        {% endfor %}
      </div>
    </div>
    

    A few insights:

    1. There's no need to declare id fields, Django does that automatically
    2. Related objects are fetched directly into template using backwards relation and are also ordered there.
    3. Also, note how element id is declared: id="panelsStayOpen-{{study.id}}"