Зачем мне нужно указывать HTML-файл в render()

#python #html #django

Вопрос:

Зачем мне нужно указывать имя html — файла в render() -я уже установил URL-адрес в файле моего проекта urls.py в django

urls.py

 url('view-books',views.viewBooks)
 

views.py

 def viewBooks(request):
    books=models.Book.objects.all()
    res=render(request,'BRMapp/view_book.html',{'books':books})
 

Почему я не могу отказаться от рендеринга view-books ?

Комментарии:

1. Я предполагаю, что вы получаете сообщение об ошибке. ваш рендер должен быть возвращен. В коде, который вы добавили, его нет. return render(request...)

Ответ №1:

я думаю, у вас опечатка

 def viewBooks(request):
    books=models.Book.objects.all()
    context = {"books":book}
    return render(request,'BRMapp/view_book.html',context)
 

ваш вопрос, зачем вам нужно имя файла html в рендеринге, потому что рендеринг-это функция, которая принимает 3 аргумента, 1-й-запрос, второй — «путь к файлу html», 3-й-контекст

дальнейшие объяснения

У вас есть базовое представление о том, как работает django, прежде всего, вы не указываете URL-адрес при рендеринге, вы указываете путь для рендеринга, какой шаблон следует визуализировать . django следуйте шаблону mvc, который вы прочитали на нем, но для его упрощения URL-адреса просто имеют задачу маршрутизации, они просто существуют для фильтрации маршрутов, чтобы ничего не делать в URL-адресе, вы можете привести 3 аргумента, два обязательны, во-первых, путь, по которому он признает, что пришло время действовать, во-вторых, имя функции, которое указывает ему, куда идти, затем его функция отвечает за обработку данных

Комментарии:

1. я не смог понять ваш ответ

2. я имею в виду, почему мне нужно указать имя html-файла в render (), почему я не могу указать URL-адрес в render?

3. какой у вас вопрос

4. вы правы, но я хочу знать, почему я не могу указать просто URL, который я уже установил urls.py то есть просмотр книг в render()?

5. изменения в ответе надеюсь, это объяснит, если у вас возникнут дополнительные сомнения, вы можете спросить

Ответ №2:

К сожалению, вы ничего не вернули, по вашему мнению. Поэтому вам нужно добавить возврат в свою функцию:

 def viewBooks(request):
    books=models.Book.objects.all()
    return render(request,'BRMapp/view_book.html', {'books':books})
 

Возможно, вы захотите взглянуть на этот учебник.

Ответ №3:

https://yourwebsite/view-book это не то же самое , что BRMapp/view_book.html , Джанго должен знать, что одно соответствует другому.

Маршрутизация в Django работает следующим образом:

  1. Пользователь отправляет запрос в Django с URL-адресом.
  2. Django просматривает ваш URL-адрес в urls.py поисках пути, который соответствует тому, что было запрошено.
  3. Когда он находит путь, например view-books , у этого пути есть представление. Представление-это просто функция ( viewBooks() ), и Django ее выполняет.
  4. Ожидается, что функция просмотра вернет содержимое, которое увидит пользователь. Вы могли бы, если бы захотели, написать всю страницу от руки в виде строки в return строке viewBooks() , но это неудобно, поэтому вместо этого вы говорите Джанго, чтобы он сделал страницу для вас, начиная с шаблона. Для этого вы звоните render() .
  5. Что render() делает, так это берет шаблон и заменяет все детали, которые необходимо заменить, для пользователя, который его увидит. Но чтобы узнать, как будет выглядеть исходный контент, его нужно откуда-то прочитать, и это HTML-файл BRMapp/view_book.html .

HTML-файл не обязательно должен иметь то же имя, что и представление, вы могли бы назвать его foobar.html , и он работал бы так же. Но независимо от его имени, вам нужно сообщить Django, что вы хотите использовать файл ( render() сообщает об этом Django), и вам нужно сообщить Django, где находится этот файл. У вас будет много разных файлов в разных местах с разными именами, и может случиться так, что у вас будет одно и то же имя для шаблонов в разных каталогах, поэтому Django не будет пытаться угадать, какой из них вам нужен: вам придется указать его путь внутри render() , чтобы Django знал, с чего начать создание страницы.

Если бы вы указали URL render() -адрес вместо пути к файлу, Django добрался бы до пункта 5, а затем снова вернулся бы к 1, чтобы выяснить, что означает этот URL-адрес, и так далее, и так далее навсегда.