Django get context data

Недавно я узнал, что вы должны переопределить метод get, когда вы специально хотите сделать что-то отличное от того, что делает представление по умолчанию:

Это достаточно просто, но когда я должен использовать get_queryset или get_context_data через get? Мне кажется, что они в основном делают то же самое или я просто что-то пропустил? Могу ли я использовать их вместе? Это основной источник путаницы для меня.

Итак, повторю: в каких случаях я бы использовал get over get_queryset или get_context_data и наоборот?

Они действительно делают разные вещи.

Это метод верхнего уровня и один для каждого HTTP-глагола — get() , post() , patch() и т.д. Вы бы переопределили его, когда хотите что-то сделать, прежде чем запрос будет обработан просмотра или после. Но это вызывается только при первом представлении вида формы, а не при отправке формы. Основной пример в документации. По умолчанию он просто отобразит настроенный шаблон и вернет HTML.

get_query_set()

Используется ListView — он определяет список объектов, которые вы хотите отобразить. По умолчанию он просто даст вам все для указанной вами модели. Переопределяя этот метод, вы можете расширить или полностью заменить эту логику. Документация Django по теме.

get_context_data()

Этот метод используется для заполнения словаря для использования в качестве контекста шаблона. Например, ListView будет заполнять результат из get_queryset() как author_list в приведенном выше примере. Вероятно, вы чаще всего будете переопределять этот метод, чтобы добавить вещи, которые будут отображаться в ваших шаблонах.

И затем в вашем шаблоне вы можете ссылаться на эти переменные.

Теперь, чтобы ответить на ваш основной вопрос, причина, по которой у вас так много методов, — это позволить вам легко придерживаться вашей логики с точностью до точки. Это не только позволяет вашему коду быть более читабельным и модульным, но и более подверженным тестированию.

Читайте также:  С какой частотой кадров лучше снимать видео

Документация должна объяснить все. Если все еще недостаточно, вы можете найти источники полезными. Вы увидите, как все реализовано с помощью mixins, которые возможны только потому, что все разделено на части.

у меня есть проблема, чтобы выяснить, как новые представления django (вид шаблона) и формы могут работать, я также не могу найти хорошие ресурсы, официальный документ не объясняет мне, как получить запрос (я имею в виду get и post) и формы в новом классе представлений django

добавлено для лучшего объяснения

например у меня есть такая форма :

и это код для чтения и печати формы (старый способ моды):

Ну мой вопрос в том, как вы можете сделать то же самое с посмотреть шаблон спасибо

2 ответов

Я бы рекомендовал просто тащиться через официальный учебник и я думаю, что осознание придет, и просветление придет автоматически.

в основном: Когда вы выдаете запрос: "’http://mydomain/myblog/foo/bar"’ Джанго будет:

  1. разрешить myblog/foo/bar для вызова функции / метода через шаблоны, определенные в urls.py
  2. вызовите эту функцию с запросом в качестве параметра, например myblog.views.foo_bar_index(request) .
  3. и просто послать какую бы строку эта функция ни возвращала браузеру. Обычно это ваш сгенерированный HTML код.

функция view обычно делает следующее:

  1. заполните контекст dict для представления
  2. отображает шаблон, используя этот контекст
  3. возвращает результирующую строку

общий вид шаблона позволяет пропустить запись этой функции и просто передать в контекстном словаре.

цитировать документы django:

все взгляды.родовой.*Вид занятия вид.родовой.Вид как их база. В docs для этого вы найдете необходимую вам информацию. В основном:

MyView.as_view создаст вызываемый объект, который вызывает представления.родовой.Вид.отправка() который в свою очередь вызовет MyView.get (), MyView.post (), MyView.обновление() и т. д. которые вы можете переопределить.

Читайте также:  Почему америка великая страна

отправка (запрос, * args, * * kwargs)

часть представления представления — метод, который принимает запрос аргумент плюс Аргументы и возвращает HTTP-ответ. Неисполнение реализация проверит метод HTTP и попытается делегировать метод, соответствующий методу HTTP; GET будет делегирован get(), POST to post () и так далее.

реализация по умолчанию также устанавливает запрос, args и kwargs как переменные экземпляра, поэтому любой метод вид может знать полный подробности запроса, который был сделан для вызова представления.

большие плюсы взглядов на основе класса (на мой взгляд):

  1. наследование делает их сухой.
  2. более декларативная форма программирования

вместо этого используйте FormView, т. е.

технически TemplateView также можно использовать, просто перезаписать метод post, так как по умолчанию представление шаблона не позволяет публиковать его:

I recently learned that you should override the get method when you specifically want to do something other than what the default view does:

That’s simple enough, but when should I use get_queryset or get_context_data over get ? To me it seems like they basically do the same thing or am I just missing something? Can I use them together? This is a major source of confusion for me.

So to reiterate: In what cases would I use get over get_queryset or get_context_data and vise versa?

2 Answers 2

They indeed do different things.

This is a top-level method, and there’s one for each HTTP verb — get() , post() , patch() , etc. You would override it when you want to do something before a request is processed by the view, or after. But this is only called when a form view is loaded for the first time, not when the form is submitted. Basic example in the documentation. By default it will just render the configured template and return the HTML.

Читайте также:  Vba регулярные выражения примеры

get_queryset()

Used by ListView s — it determines the list of objects that you want to display. By default it will just give you all for the model you specify. By overriding this method you can extend or completely replace this logic. Django documentation on the subject.

get_context_data()

This method is used to populate a dictionary to use as the template context. For example, ListView s will populate the result from get_queryset() as author_list in the above example. You will probably be overriding this method most often to add things to display in your templates.

And then in your template you can reference these variables.

Now to answer your main question, the reason you have so many methods is to let you easily stick your custom logic with pin-point accuracy. It not only allows your code to be more readable and modular, but also more testable.

The documentation should explain everything. If still not enough, you may find the sources helpful as well. You’ll see how everything is implemented with mixins which are only possible because everything is compartmentalized.