Django - Взятие объектной модели с помощью тега select и передача этого объекта в другое представление - PullRequest
0 голосов
/ 11 сентября 2018

Я борюсь со следующей проблемой.В моем проекте у меня есть следующая модель:

models.py

class InputSignal(models.Model):

    name = models.CharField(max_length=512)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    adnotations = models.TextField(blank=True, null=True)
    input_file = models.FileField(upload_to='signals/', null=False, validators=[validate_file_extension])
    add_date = models.DateTimeField(default=datetime.now())
    last_edit_date = models.DateTimeField(default=datetime.now())
    last_json_results = models.FileField(upload_to='resuts/')

    objects = models.Manager()

    def delete(self):
        self.input_file.delete()
        super().delete()

    def __str__(self):
        return self.name

    def add_date_pretty(self):
        return self.add_date.strftime('%b %e %Y')

Два адреса URL:

urls.py

path('display/list', displayviews.display_list, name='display-list'),
path('display/details/<int:signal_id>', displayviews.display_details, name='display-details'),

И две функции просмотра:

views.py

def display_list(request):

    signals = InputSignal.objects.filter(author=request.user)

    return render(request, 'display_list.html', {'signals': signals})

def display_details(request, signal_id):

    signal = get_object_or_404(InputSignal, pk=signal_id)

Шаблон первой функции представления вэтот момент выглядит так:

display_list.html

<div class="row mt-2">
    <div class="col-lg-1"></div>
    <div class="col-lg-10">
    <select class="form-control mt-2 text-center">

        {% for signal in signals %}
            <option>
            <h2>{{ signal.name }}</h2>
            </option>
        {% endfor %}

  </select>
</div>
<div class="col-lg-1"></div>
</div>

<div class="row mt-3 mb-2">
    <div class="col-lg-4"></div>
    <div class="col-lg-4">
        <a href="{% url 'storage-main' %}" class="btn btn-outline-success btn-block">Perform Analysis</a>
    </div>
    <div class="col-lg-4"></div>
</div>

Я хотел бы на основе структуры этого шаблона разработать решение, которое после выбора имени сигналаиз тега выбора и нажатия кнопки «выполнить анализ» перейдите к следующему представлению - display_details (request, signal_id).Где я буду сохранять ранее выбранный объект модели в переменную.Выбирая правильный объект, я хотел бы использовать идентификатор объекта.Я хотел бы попросить помощи, что я смог разработать, представленный выше.

1 Ответ

0 голосов
/ 11 сентября 2018

Несколько вещей здесь.

Для отправки данных с веб-страницы вам нужен элемент формы (если вы не используете Ajax, который здесь не кажется необходимым). Ваше поле выбора нуждается в атрибуте name, а для каждой опции требуется значение для отправки. Кроме того, вы не можете отправить форму со ссылкой a; вам нужна кнопка отправки. Итак:

<form action="{% url 'display-details' %}">
    <select name="signal_id" class="form-control mt-2 text-center">

        {% for signal in signals %}
            <option value="{{ signal.id }}">
            <h2>{{ signal.name }}</h2>
            </option>
        {% endfor %}

    <button class="btn btn-outline-success btn-block">Perform Analysis</button>

</form>

Теперь эти данные передаются в строке запроса в представление display_details, например, "/ display / details /? Signal_id = 5". Таким образом, вам нужно удалить параметр из шаблона URL и получить данные внутри представления из параметров GET:

path('display/details/', displayviews.display_details, name='display-details'),

...

def display_details(request):
    signal_id = request.GET['signal_id']
    signal = get_object_or_404(InputSignal, pk=signal_id)
...