Джанго несколько моделей в одном представлении - PullRequest
0 голосов
/ 06 июня 2019

Какова лучшая практика в этом отношении, у меня есть класс проектов и класс обновлений, и данные из обоих должны отображаться на экране вместе. Я неправильно это спроектировал?

from datetime import datetime
from django.contrib.auth.models import Permission, User
from django.db import models
from django.urls import reverse

class Area(models.Model):
    area_name = models.CharField(max_length=45,unique=True)
    area_code = models.CharField(max_length=45,unique=True)

    def __str__(self):
        return self.area_name

class Priority(models.Model):
    priority = models.CharField(max_length=16, unique=True)
    colour = models.CharField(max_length=7, unique=True)

    def __str__(self):
        return self.priority


class Project(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    area_id = models.ForeignKey(Area, on_delete=models.PROTECT)
    title = models.CharField(max_length=128, unique=True)
    summary = models.CharField(max_length=256)
    others = models.CharField(max_length=128, blank=True)
    deadline = models.DateField(blank=True)
    priority = models.ForeignKey(Priority, on_delete=models.PROTECT)
    closed = models.DateTimeField(blank=True,null=True)

    def __str__(self):
        return self.title


class UpdateCategory(models.Model):
    cat_name = models.CharField(max_length=24,unique=True)

    def __str__(self):
        return self.cat_name


class Update(models.Model):
    p_id = models.ForeignKey(Project, on_delete=models.PROTECT)
    category = models.ForeignKey(UpdateCategory, on_delete=models.PROTECT)
    update = models.TextField(max_length=2048)
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.update

Это мой файл просмотра.

from django.contrib.auth import authenticate, login
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.core.files.storage import FileSystemStorage
from django.http import HttpResponseRedirect, HttpResponse
from django.shortcuts import render, redirect, get_object_or_404
from django.template import RequestContext
from django.urls import reverse
from django.views.generic import (
    CreateView,
    DetailView,
    DeleteView,
    ListView,
    TemplateView,
    UpdateView
)
from .forms import ProjectModelForm
from .models import (
    Project,
    Area,
    Priority,
    Update,
    UpdateCategory
)

class ProjectView(ListView):
    template_name = 'project_portal/sidev.html'
    queryset = Project.objects.all()

def get_context_data(self, **kwargs):
    context = super(ProjectView, self).get_context_data(**kwargs)
    context['p_model'] = Project.objects.all()
    context['u_model'] = Update.objects.all()
    return context

Хотя это не дает мне никаких ошибок, я не могу понять, как я могу получить данные от двух моделей. Я подозреваю, что есть проблема с этим также, поскольку я не могу проверить что-либо из этого, я могу получить данные из проекта, но я не могу получить данные обновления в шаблон.

html, body {
  margin: 0;
  padding: 0;
  text-align: left;
  margin-left: auto;
  margin-right:auto;
  font: 10pt 'SkyTextRg', "Sky Text", verdana, arial, sans-serif;
  color: #222;
  background-color: transparent;
  /*text-shadow: 0 0 0 transparent, 0 0px 0px #009dde, 4px 4px 4px #eee;*/
}

html {
  /*background: url(../img/proj_bg.png) top repeat-x;*/
  background-attachment: fixed;
  background: #fff;
}

img {
  border: 0;
}


p {
  text-align: left;
  margin: 0;
  padding: 0;
  font-size: 12px
}

h1, h2, h3, h4, h5, h6 {
  color: #42a2da;
  font-family: "SkyTextRg", "Sky Text", arial;
  font-weight: normal;
  text-align: left;
}

h1 {
  font-size: 24pt;
  padding: 0px;
  margin-top: 5px;
}

h2 {
  font-size: 14pt;
  padding-top: 0px;
}

h3	{
  font-size: 12pt;
}

h4 {
  margin: 0px;
  padding: 0px;
}

header {
  z-index: 1;
  position: fixed;
  opacity: 0.95;
  top:0; left: 0;
  width: 100%;
  height: 70px;
  text-align: left;
  background: #fff; /* Old browsers */

  -webkit-box-shadow: 0px 10px 20px 0px rgba(0,0,0,0.1);
  -moz-box-shadow: 0px 10px 20px 0px rgba(0,0,0,0.1);
  box-shadow: 0px 10px 20px 0px rgba(0,0,0,0.1);
}

header div {
  display: inline-block;
  margin-left: 30px;
}

header div.navFixedLogo {
  opacity:1;
  position:fixed;
  top:12px;
  left:1%;
  z-index: 1;
}

header div.navFixedMain {
  position:fixed;
  top:21px;
  left:26%;
  z-index: 1;
}

header div.navFixedRight {
  position:fixed;
  top:21px;
  right:5%;
  z-index: 1;
}

header div a, header div a:visited, header div a:active, header div a:hover {
  font-size: 18pt;
  color: #42a2da;
  opacity: 1;
  font-weight: 300;
  padding: 10px 10px;
  text-decoration: none;
  margin: auto 0;
}


header div a:active, header div a:hover{
  opacity: 0.7;
  text-decoration: none;
}


#content, #content2 {
  position: relative;
  float:left;
  margin: 100px auto;
  padding: 0 66px;
  width:93%;
  height: auto;
  background: none;
  text-align: left;
}

.container {
  display: grid;
  grid-template-columns: 2fr 3fr 14fr;
  /* grid-template-columns: auto; */
  grid-template-rows: 20px 180px 30px;
  grid-gap: 0px;
  border: 1px groove #deebff;
  padding: 3px;
}

tr {
  line-height: 21px;
}

.box1 {
  grid-column: 1;
  grid-row: 1 / 5;
}

.box2 {
  grid-column: 2 / 4;
  grid-row: 1 / 2;
}

.box3 {
  grid-column: 4;
  grid-row: 1 / 2;
  text-align: right;
}

.box4 {
  grid-column: 2 / 3;
  grid-row: 2;
  padding: 3px 0px 0px 4px;
}

.box5 {
  grid-column: 3 / 5;
  grid-row: 2;
  overflow: auto;
  border-style: ridge;
  border-width: medium;
  border-color: black;
  border-radius: 7px;
  padding: 0px 0px 3px 4px;
  height: 100%;
  flex: 1;
}

.box6 {
  grid-column: 2;
  grid-row: 3;
  margin-top: 10px;
}

.box7 {
  grid-column: 3 / 5;
  grid-row: 3;
  margin-top: 10px;
  border: 1px solid blue;
  background-color: #4ba6db;
}

.square {
  height: 50px;
  width: 50px;
  background-color: green;
  margin: 30px;
}



/* .update {
  overflow: auto;
  border-style: ridge;
  border-width: medium;
  border-color: black;
  border-radius: 10px;
  height: 100%;
  flex: 1;
} */
<!DOCTYPE html>
{% load staticfiles %}
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>Project Portal :: sidev</title>
    <link rel="stylesheet" href="{% static 'project_portal/css/master.css' %}">
    <link rel="shortcut icon" href="{% static 'project_portal/images/favicon.ico' type='image/x-icon' %}">
  </head>
  <body>
    <div id="center">

      <header>
        <div class="navFixedLogo">
          <img src="{% static 'project_portal/images/index.png' %}" alt="Sky Projects Portal Logo" height="48px">
        </div>
        <div class="navFixedRight">
          <img src="{% static 'project_portal/images/icon_add_circle.png' %}" alt="Add" width="32">
        </div>
      </header>

      <div id="main">
        <div id="content">
          <hgroup>
            <h1>OTT</h1>
            <h2>Service Integration Development Project Portal</h2>
          </hgroup
        </div>
        <div class="container">
          {% if object_list %}
          {% for item in object_list %}

          <div class="box1">
            <h4>{{ item.title }}</h4>
            <p>Project Status</p>
            <div class="square"></div>
          </div>

          <div class="box2">
            <strong>{{ item.summary }}</strong>
          </div>

          <div class="box3">
            <strong>{{ item.user }}</strong>
          </div>

          <div class="box4">
            <table class="items">
              <col width="160px">
              <tr>
                <!-- <td>Monitoring Status</td> -->
                <td>Impact Scenario</td>
                <td>&#x2705;</td>
              </tr>
              <tr>
                <td>Support Model</td>
                <td>&#x2705;</td>
              </tr>
              <tr>
                <td>Impact Scenarios</td>
                <td>&#x2705;</td>
              </tr>
              <tr>
                <td>Training</td>
                <td>&#x2705;</td>
              </tr>
              <tr>
                <td>Service Rehearsals</td>
                <td></td>
              </tr>
              <tr>
                <td>Support Documentation</td>
                <td></td>
              </tr>
              <tr>
                <td>Other Updates</td>
                <td></td>
              </tr>
            </table>
          </div>

          <div class="box5">
            <table>
              <tr>
                <td>{{ Update data here }}</td>
              </tr>
              <tr>
                <td>{{ Update data here }}</td>
              </tr>
              <tr>
                <td>{{ Update data here }}</td>
              </tr>
              <tr>
                <td>{{ Update data here }}</td>
              </tr>
              <tr>
                <td>{{ Update data here }}</td>
              </tr>
              <tr>
                <td>{{ Update data here }}</td>
              </tr>
              <tr>
                <td>{{ Update data here }}</td>
              </tr>

            </table>

          </div>
          <div class="box6">
            <h4>Project Timeline</h4>
          </div>
          <div class="box7">TimeLine</div>
          {% endfor %}
          {% endif %}
        </div>
      </div>
    </div>
  </body>
</html>

Вначале я думал, что моя модель плохо сделана, но я скопировал схему со старого портала и разделил обновления на категории. Что меня больше всего смущает, так это утверждение If в моем html, я могу проверить одну модель, но не могу понять, как проверить другую, не вкладывая их, что на самом деле кажется очень плохой идеей, и я не фанат просто раздеть его, потому что я не могу заставить его работать.

Я действительно хочу использовать лучшие практики, если это возможно, поэтому, если мне придется полностью изменить дизайн моей модели, я сделаю это, но это первая работа с базой данных, которую я сделал, поэтому я не знаю, куда обратиться, чтобы получить рекомендации по этот.

...