Я использую Django, PyCharm 2018.3.7, Python 3.7 и Postgres.
К сожалению, я не понимаю, как отобразить на одной странице экрана (форма Django) результаты для 2 отдельных наборов запросов, которым требуется один и тот же идентификатор, переданный динамическим запросом фильтра c (GET). Существует таблица / модель (НАЗНАЧЕНИЯ) с отношением один-ко-многим к другой таблице / модели (ПРОДУКТЫ). Передаваемый ID - это ASSIGNMENTS.ID, который является PK ASSIGNMENTS и FK ПРОДУКТОВ.
Я не пытаюсь объединить эти 2 набора запросов. Мне нужно, чтобы пользователь сначала увидел информацию о НАЗНАЧЕНИИ, а затем ниже. Я хочу, чтобы он увидел все ПРОДУКТЫ, принадлежащие этому НАЗНАЧЕНИЮ.
Мне не нужно обновлять / создавать данные, поэтому POST не необходимо. Только хотите извлечь, GET, данные, которые существуют.
Ниже приведен код для models.py, views.py и шаблонов. Он прекрасно работает только с заданиями.
MODELS.PY
class Assignments(models.Model):
id = models.DecimalField(db_column='ID', primary_key=True, max_digits=9, decimal_places=0)
name = models.CharField(db_column='NAME', unique=True, max_length=40)
def __str__(self):
return self.name + ' ' + '(' + '#' + str(self.id) + ')'
class Meta:
ordering = 'name',
db_table = 'ASSIGNMENTS'
class Products(models.Model):
id = models.DecimalField(db_column='ID', primary_key=True, max_digits=11, decimal_places=0)
assignment = models.ForeignKey(Assignments, models.DO_NOTHING, related_name='productsfor_assignment', db_column='ASSIGNMENT_ID', blank=True, null=True)
name = models.CharField(db_column='NAME', max_length=80)
def __str__(self):
return self.name + ' ' + '(' + '#' + str(self.id) + ')'
class Meta:
ordering = 'name',
db_table = 'PRODUCTS'
VIEWS.PY
def search_form(request):
return render(request, 'assignments/search_form.html')
def search(request):
if 'q' in request.GET and request.GET['q']:
q = request.GET['q']
assign = Assignments.objects.filter(id__icontains=q)
return render(request, 'assignments/search_results.html',
{'AssignmentsResults': assign, 'query': q})
else:
# if the query is empty, render the 'search_form html' template again.
# display an error message in that template. So, pass a template variable.
# 'search_form html' will check for the 'error' variable
return render(request, 'assignments/search_form.html', {'error': True})
TEMPLATE 'search_form. html '
{% extends "base.html" %}
{% block content %}
<br><br>
<h1> Assignment ID Search Form </h1>
<br><br>
{% if error %}
<p style="color: red;">Please submit a search term.</p>
{% endif %}
<form action="/search/" method="get">
<input type="text" name="q" placeholder="Enter ID here ...">
<input type="submit" value="Search">
</form>
<p>
Page last updated: {{ last_updated|date:'D d F Y' }}
</p>
{% endblock content %}
ШАБЛОН' search_results. html '
{% extends "base.html" %}
{% block content %}
<br><br>
<h1> Assignment ID Search Results</h1>
<p>You searched for: <strong>{{ query }}</strong></p>
{% if AssignmentsResults %}
<ul>
{% for assignments in AssignmentsResults %}
<li>
{{ assignments.id }}, {{ assignments.name }}
</li>
{% endfor %}
</ul>
{% else %}
<p>No assignments matched your search criteria.</p>
{% endif %}
{% endblock content %}
Это то, что я наконец собрал, чтобы включить продукты (показано ниже в сбой views.py и шаблон). Но это не работает.
Это был FAILED VIEWS.PY
def search_form(request):
return render(request, 'assignments/search_form.html')
def search(request):
if 'q' in request.GET and request.GET['q']:
q = request.GET['q']
assign = Assignments.objects.filter(id__icontains=q)
prod = Products.objects.filter(assignment__icontains=q)
return render(request, 'assignments/search_results.html',
{'AssignmentsResults': assign, 'query': q})
return render(request, 'assignments/search_results.html',
'ProductsResults': prod, 'query': q)
else:
# if the query is empty, render the 'search_form html' template again.
# display an error message in that template. So, pass a template variable.
# 'search_form html' will check for the 'error' variable
return render(request, 'assignments/search_form.html', {'error': True})
Это был FAILED SEMPLATE CODE 'search_results. html
{% extends "base.html" %}
{% block content %}
<br><br>
<h1> Assignment ID Search Results</h1>
<p>You searched for: <strong>{{ query }}</strong></p>
{% if AssignmentsResults %}
<ul>
{% for assignments in AssignmentsResults %}
<li>
{{ assignments.id }}, {{ assignments.name }}
</li>
{% endfor %}
</ul>
<p> These are the Products attached to the Assignment.</p>
{% if ProductsResults %}
<ul>
{% for products in ProductsResults %}
<li>
{{ products.assignment }}, {{ products.name }}
</li>
{% endfor %}
</ul>
{% else %}
<p> No products for this assignment exist.</p>
{% endif %}
{% else %}
<p>No assignments matched your search criteria.</p>
{% endif %}
{% endblock content %}
Я создал проект, выполнив 'Создать сайт с Django 2, обновленный для Django 2.2' Найджелом Джорджем. Я посмотрел несколько обучающих видео на YouTube и прочитал вопросы по stackoverflow. (Это только пара.)
Как объединить два или более наборов запросов в представлении Django?
Отображение серии встроенных форм для набор запросов Django моделей
Django: добавление набора запросов в наборы inlineform
Django вложенные наборы запросов
InlineFormSet с набором запросов другой модели
Однако ни один из них не смог помочь мне с моей проблемой представления двух отдельных результатов набора запросов в одной форме.
Я определенно буду признателен за любые предложения и помощь. Спасибо