Как правильно передать несколько аргументов (из шаблона / контекста) в представление в Django? - PullRequest
0 голосов
/ 28 сентября 2018

Я относительно новичок в Джанго (v = 2.1).Я застрял в течение нескольких дней в поисках решения этой проблемы, которое, на мой взгляд, довольно легко, но, несмотря на чтение многих постов здесь и в других местах, так и не смогло его решить.У меня есть две модели: учитель и задание.Очень упрощенно:

models.py    

class Teacher(models.Model):
    name = models.CharField(max_length=200)

class Assignment(models.Model):
    title = models.CharField(max_length=200)
    teacher = models.ForeignKey(Teacher, on_delete=models.SET_NULL, null=True)

У меня есть (рабочий) сайт со списком заданий учителя №.x, который я создал с помощью универсальной функции DetailView и некоторого кода, выглядит следующим образом:

assignments_list.html

{% for assignment in teacher.assignment_set.all %}
    ...
    <a href="{% url 'assignment-detail' pk1=assignment.teacher.pk pk2=assignment.pk %}">{{assignment.title}}</a>
    ...
{% endfor %}

Когда я нажимаю на assignment.title, я хочу получить страницу сведений о назначении этого конкретного учителя.Я использую этот URL Conf:

urls.py

urlpatterns += [path('teacher/<int:pk1>/assignment/<int:pk2>/', views.AssignmentDetailView.as_view(), name = 'assignment-detail')]

и я использую эту функцию просмотра (я пробовал несколько вариантов):

views.py

from .models import Teacher, Assignment
from django.views import generic

class AssignmentDetailView(generic.DetailView):
    model = Assignment
    template_name = 'assignment_detail.html'

    def get_queryset(self, **kwargs):
        queryset = super(AssignmentDetailView, self).get_queryset()
        return queryset.filter(teacher_id=self.kwargs['pk1'], pk=self.kwargs['pk2'])

Я пытаюсь передать два параметра (pk1 и pk2), которые находятся в контексте страницы (которая содержит список назначений).Если я нажимаю на ссылку (assignment.title), я вижу URL с правильными номерами для pk1 и pk2 (я вижу это в адресной строке URL, например, http://localhost:8000/teacher/2/assignment/4). Но страница не отображается. При настройкеВ некоторых вещах я получаю разные ошибки:

  • Синтаксические ошибки, проблемы с отсутствующими аргументами ... до сих пор решены.
  • 'Набор запросов не получил ни одного объекта' (или аналогичная формулировка).
  • Текущая ошибка: 'Представление app.views.AssignmentDetailView не вернуло объект HttpResponse. Вместо этого он вернул None.'

Мои вопросы:

  1. Что я делаю не так? Правильно ли я передаю? Или проблема в моем представлении? ... Как передать аргументы (Teacher pk и Assignment pk) из шаблона (или, просто, контекста?) Вфункция представления? И как использовать их для возврата правильных объектов из моей модели?
  2. Нужно ли передавать параметры каждый раз, когда вызывается функция представления, или параметры передаются автоматически из одного объекта?посмотреть (шаблон) на другой?
  3. Сначала я передаю аргументы через URL, но позже я бы хотел передать их, не переходя через URL: могу ли я использовать аргументы шаблона, но использовать их только в представлении (не в URL)?Это путь?

Большое спасибо за любые советы.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Большое спасибо всем за быстрый ответ (я этого не ожидал!) Извините, если я не реагирую на все комментарии, но я ценю каждую помощь.

Я снова работал над этим и теперь понимаю, чтоqueryset возвращает набор, а не один экземпляр модели (для которого я лучше использую 'get').Я изменил следующим образом, и теперь это работает:

assignments_list.html

<a href="{% url 'assignment-detail' pk=assignment.teacher.pk pk1=assignment.pk %}">


views.py

class AssignmentDetailView(generic.DetailView):
    model = Assignment
    template_name = 'assignment_detail.html'

def get_object(self, **kwargs):
    assignment = Assignment.objects.get(id=self.kwargs['pk1'])
    return assignment

def get_context_data(self, **kwargs):
    context = super(AssignmentDetailView, self).get_context_data(**kwargs)
    context['teacher'] = Teacher.objects.get(id=self.kwargs['pk'])
    return context

Теперь это работает.Мне нужны были оба числа pk, потому что заголовок на assignment_detail.html - {% include 'header-teacher.html' %}, который содержит <a href="{% url 'teacher-profile' teacher.pk %}">.Теперь я передал два значения из URL: pk1 для получения правильного назначения и pk для предоставления (дополнительного) правильного контекста (который доставляет pk учителя).

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

Ваше представление возвращает только набор запросов, а не фактический объект (который необходим подробному представлению).Если вы просто пытаетесь получить объект присваивания, вам даже не нужно передавать teacher_id.На первой странице вы перечисляете все задания от одного учителя, вам просто нужно передать файл assignment.pk в подробный вид.

path('assignment/<int:pk>/', views.AssignmentDetailView.as_view(), name='assignment-detail')

Если вы создадите свой URL-адрес, как указано выше, подробный вид обрабатывает получение объекта с помощью pk.Если вы хотите, чтобы в вашем URL был идентификатор учителя, вы все равно можете это сделать, но назовите его как <int:teacher_id>.По умолчанию подробный вид будет искать только «pk» в kwargs, поэтому игнорируйте teacher_id

...