Как две зависимые модели могут объединяться в django-модель, чтобы я мог извлечь все данные из этих двух моделей? - PullRequest
0 голосов
/ 18 октября 2019

Я пишу один блог для моей проектной группы. На одном этапе я сейчас сложен, и ни одно из решений, доступных через открытые источники в youtube, а также в stackoverfolow, не решило мою проблему. Я знаю, что это просто, но поскольку я не очень эффективен в использовании системной модели django, я не смог ее решить. У меня есть 4 модели, связанные с ForeignKey. Среди этих 4 моделей две из них я хочу использовать для подробного просмотра. Я не могу заполнить данные из обеих моделей.

Одно название модели "Term_t" выглядит следующим образом:

class Term_t(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1, on_delete=models.CASCADE)
    preferred_term = models.CharField(max_length=120)
    slug = models.SlugField(unique=True)
    definition = models.TextField()
    agrovoc_id = models.TextField()
    uri = models.TextField()
    translation_de = models.TextField()
    broader_concept= models.CharField(max_length=120)
    states = models.ForeignKey(TermState_t, default=1, on_delete=models.CASCADE)
    categories = models.ForeignKey(Category_t, default=1, on_delete=models.CASCADE)
    date_created = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.preferred_term

    def __str__(self):
        return self.preferred_term

    class Meta:
        ordering = ['-date_created']

## The other model is : 
class AlternateTerm_t(models.Model):
    alternate_terms = models.CharField(max_length=120)
    pref_term = models.ForeignKey('Term_t', default=1, on_delete=models.CASCADE)

    def __str__(self):
        return self.alternate_terms

#My views.py is : 
from django.shortcuts import render
from .models import Term_t, AlternateTerm_t
from itertools import chain

# Create your views here.

#from django.views import generic


#class TermList(generic.ListView):
    #queryset = Term_t.objects.all().order_by("-date_created")
    #template_name = 'index.html'

#class TermDetail(generic.DetailView):
    #model = Term_t
    #template_name = 'term_detail.html'

######################################

def term_list(request):
    terms = Term_t.objects.all()
    context = {
        'term_list': terms
    }

    return render(request,"index.html", context)

def term_detail(request, slug):
    term = Term_t.objects.filter(alternateterm_t__pref_term= 'term_t__preferred_term').values('user','preferred_term','alternateterm_t__alternate_terms','definition','agrovoc_id','uri','translation_de','broader_concept','date_created').get(slug=slug)
    context={
        'term':term,

    }
    return render(request, "term_detail.html", context)

    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1, on_delete=models.CASCADE)
    preferred_term = models.CharField(max_length=120)
    slug = models.SlugField(unique=True)
    definition = models.TextField()
    agrovoc_id = models.TextField()
    uri = models.TextField()
    translation_de = models.TextField()
    broader_concept= models.CharField(max_length=120)
    states = models.ForeignKey(TermState_t, default=1, on_delete=models.CASCADE)
    categories = models.ForeignKey(Category_t, default=1, on_delete=models.CASCADE)
    date_created = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now=True)


My term_detail.html is :
{% extends "base.html" %}
{% block content %}

<style>
    .row > .property-label {
    float: left;
    padding-top: 10px;
    padding-bottom: 10px;
    padding-left: 15px;
    padding-right: 15px;
    position: relative;
    width: 225px;
    }
    .row > .property-value-column {

    display: inline-block;
    width: calc(100% - 225px);
    padding-top: 10px;
    padding-bottom: 10px;
    position: relative;


}
.row > .property_under{
    border-bottom: 2px solid #34b1eb;}

body {

    font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
    font-size: 14px;
    line-height: 1.42857143;
    color: #333;

}
.break{
  height: 10px;
}
.property-label > .property-click {

    border-bottom: 2px dotted #CFCFCF;

    }

</style>
<div class="container">
  <div class="row">
    <div class="col-md-8 card mb-4  mt-3 left  top">
      <div class="card-body">

          <div class="row">
              <div class="property-label">
              <span class="property-click">PREFERRED TERM</span>
              </div>
              <div class="property-value-column">
                  <h1>{% block title %} {{ term.preferred_term }} {% endblock title %}</h1>
              </div>
          </div>
          <div class="row">
              <div class="property-label">
              <span></span>
              </div>
              <div class="property-value-column property_under">
                  <p class=" text-muted">{{ term.user }} | {{ term.date_created }}</p>
              </div>
          </div>
          <div class="row">
              <div class="property-label">
              <span class="property-click">ALTERNATE TERMS</span>
              </div>
              <div class="property-value-column property_under">
                  <p class="card-text ">{{ term.alternate_terms }}</p>
              </div>
          </div>

          <div class="row">
              <div class="property-label">
              <span class="property-click">DEFINITION</span>
              </div>
              <div class="property-value-column property_under">
                  <p class="card-text ">{{ term.definition | safe }}</p>
              </div>
          </div>
          <div class="break"></div>
          <div class="row">
              <div class="property-label">
              <span class="property-click">BROADER CONCEPT</span>
              </div>
              <div class="property-value-column property_under">
                  <p class="card-text ">{{ term.broader_concept}}</p>
              </div>
          </div>
          <div class="break"></div>
          <div class="row">
              <div class="property-label">
              <span class="property-click">AGROVOC ID</span>
              </div>
              <div class="property-value-column property_under">
                  <p class="card-text ">{{ term.agrovoc_id }}</p>
              </div>
          </div>
          <div class="break"></div>
          <div class="row">
              <div class="property-label">
              <span class="property-click">URI</span>
              </div>
              <div class="property-value-column property_under">
                  <p class="card-text ">{{ term.uri }}</p>
              </div>
          </div>
           <div class="break"></div>
          <div class="row">
              <div class="property-label">
              <span class="property-click">DEFINITION (DE)</span>
              </div>
              <div class="property-value-column property_under">
                  <p class="card-text ">{{ term.translation_de | safe }}</p>
              </div>
          </div>
      </div>
    </div>
    {% block sidebar %} {% include 'sidebar.html' %} {% endblock sidebar %}
  </div>
</div>
{% endblock %}
#

У меня есть некоторые ошибки, подобные следующим:

ValueError at /soil-upper-texture-modification/

invalid literal for int() with base 10: 'term_t__preferred_term'

Request Method:     GET
Request URL:    http://127.0.0.1:8000/soil-upper-texture-modification/
Django Version:     2.1.4
Exception Type:     ValueError
Exception Value:    

invalid literal for int() with base 10: 'term_t__preferred_term'

Exception Location:     D:\agrovoc_tool\venv\lib\site-packages\django\db\models\fields\__init__.py in get_prep_value, line 965
Python Executable:  D:\agrovoc_tool\venv\Scripts\python.exe
Python Version:     3.6.6
Python Path:    

['D:\\agrovoc_tool\\src',
 'C:\\Program Files\\Hexagon\\ERDAS IMAGINE '
 '2015\\usr\\lib\\Win32Release\\python',
 'D:\\agrovoc_tool\\venv\\Scripts\\python36.zip',
 'C:\\Users\\zoarder\\AppData\\Local\\Programs\\Python\\Python36\\DLLs',
 'C:\\Users\\zoarder\\AppData\\Local\\Programs\\Python\\Python36\\lib',
 'C:\\Users\\zoarder\\AppData\\Local\\Programs\\Python\\Python36',
 'D:\\agrovoc_tool\\venv',
 'D:\\agrovoc_tool\\venv\\lib\\site-packages',
 'D:\\agrovoc_tool\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.6.egg',
 'D:\\agrovoc_tool\\venv\\lib\\site-packages\\pip-10.0.1-py3.6.egg']

Server time:    Fri, 18 Oct 2019 10:34:20 +0000

Я хочу получить alternate_terms вмой подробный_обзор, конкретное место отмечено на следующем изображении: (могло быть один и более alternate_terms для одного предпочтительного термина, поэтому все альтернативные термины будут вставляться один за другим (,)

Вывод подробного изображения

Пожалуйста, помогите мне выйти из этой проблемы.

С уважением

Zoarder

1 Ответ

0 голосов
/ 22 октября 2019

Я решил свою проблему небольшим изменением в views.py и detail.html:

def term_detail(request, id):
id=id

term = Term_t.objects.filter(id=id)
my_term = AlternateTerm_t.objects.filter(pref_term= id)
context={
    'term':term,
    'my_term':my_term,
}
return render(request, "term_detail.html", context)

Редактирование HTML-страницы:

<div class="row">

              <div class="property-label">

              <span class="property-click">ALTERNATE TERM</span>
              </div>

                  <div class="property-value-column property_under">
                      <p class="card-text ">{%for r in my_term %}{{r.alternate_terms}}{% if not forloop.last %}, {% endif %}{% endfor %}</p>
                  </div>

          </div>

ВЫХОД:

введите описание изображения здесь

...