Django - получение данных для 2 отдельных наборов запросов на одной странице - PullRequest
0 голосов
/ 28 января 2020

Я использую 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 с набором запросов другой модели

Однако ни один из них не смог помочь мне с моей проблемой представления двух отдельных результатов набора запросов в одной форме.

Я определенно буду признателен за любые предложения и помощь. Спасибо

1 Ответ

0 голосов
/ 28 января 2020

Хорошо, посмотрим. Если вы просто хотите отобразить информацию, которая, по-видимому, предназначена для search_results. html, я предлагаю вам немного изменить свой запрос следующим образом. (Я постараюсь вычистить странные вещи (например, имея два последовательных оператора возврата) как можно больше, чтобы проиллюстрировать свою точку зрения)

views.py:

from django.shortcuts import render, redirect
from django.urls import reverse


def search(request):
    q = request.GET.get('q', None)
    if q:
        assignments_qs = Assignments.objects.filter(id__icontains=q) \
            .prefetch_related('productsfor_assignment')
        context_data = {'assignments': assignments_qs}
        return render(request, 'assignments/search_results.html', context_data)
    else:
        return redirect(reverse('search_form', kwargs={'error': True}))


def search_form(request, error=False):
    return render(request, 'assignments/search_form.html', {'error': error})

search_results. html

{% if assignments %}
    <ul>
        {% for assignment in assignments %}
            <li>
                {{ assignment.id }}, {{ assignment.name }}
            </li>                 
            {% if assignment.productsfor_assignment.exists %}
                <p> These are the Products attached to the Assignment.</p>
                <ul>
                {% for product in assignment.productsfor_assignment.all %}
                    <li>
                        {{ product.assignment }}, {{ product.name }}
                    </li>
                {% endfor %}
                </ul>
            {% endif %}
        {% endfor %}
    </ul>
{% else %}
    <p>No assignments matched your search criteria.</p>
{% endif %}

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

...