Управляющие запросы для просмотра и вывода шаблона в django - PullRequest
1 голос
/ 19 мая 2019

Это представление для получения всех записей в модели EducationalRecord:

def all_education_resume(request):
    RESUME_INFO['view'] = 'education'
    educations_resume = EducationalRecord.objects.all().order_by('-created_date')
    template = 'resumes/all_resume.html'
    context = {'educations_resume': educations_resume, 'resume_info': RESUME_INFO}
    return render(request, template, context)

Теперь, если я хочу написать именно это представление для других моделей (например, резюме работы, резюме исследования и т. Д.).), Я должен другой посмотреть один отдельно. Мой вопрос:

Как я могу получить представление для всех этих запросов, поэтому сначала проверьте URL-адрес запроса, а затем выполните соответствующий запрос?Как я могу контролировать запросы URL в моих представлениях?

Мой другой вопрос точно такой же, как мой первый вопрос, с таким отличием:

управляющее представление, которое должно отображаться в определенном шаблоне. Другими словами, во втором вопросе соотношение между шаблоном и представлением вместо отношения представления к URL или как создать шаблон для нескольких представлений (например, длярезюме резюме базы данных возобновляется, у меня есть шаблон), а затем, в зависимости от того, какое представление рендеринга, вывод шаблона отличается.

Я реализовал эти две проблемы следующим образом:

  1. Я написал представление для каждого запроса!
  2. В каждом представлении я установил значение RESUME_INFO['view'], а затем проверил его на странице шаблона и указалсоответствующий шаблон.

Как лучше всего решить эти два вопроса?

1 Ответ

1 голос
/ 19 мая 2019

Как я могу получить представление для всех этих запросов, поэтому сначала проверьте URL-адрес запроса, а затем выполните соответствующий запрос?Как я могу контролировать запросы URL в моих представлениях?

Вы можете получить доступ к request.path, или вы можете позволить url(..) s передать параметр с помощью kwargs, который содержит ссылку на модель, например,но это обычно плохой дизайн.Как правило, если вы используете разные модели, вам, вероятно, придется упорядочить их по-разному, отфильтровать их по-разному, отобразить их по-разному и т. Д. Если нет, то это обычно указывает на то, что с моделированием что-то не так.

Выоднако можно использовать представления на основе классов [Django-doc] , чтобы удалить как можно больше шаблонных данных.Ваше представление выглядит как ListView [Django-doc] . Используя такое представление и исправляя при необходимости, мы можем опустить большую часть шаблона * "code:

# app/views.py

from django.views.generic.list import ListView

class MyBaseListView(ListView):
    resume_info = None
    <b>template = 'resumes/all_resume.html'</b>

    def <b>get_context_data</b>(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context['resume_info'] = {'view': self.resume_info}
        return context

В отдельных списках необходимо указать resume_info и model или queryset, чтобы отобразить его с помощью шаблона 'all_resume.html', например:

# app/views.py

# ...

class EducationalResumeView(<b>MyBaseListView</b>):
    <b>queryset = EducationalRecord.objects.order_by('-created_date')</b>
    resume_info = 'education'

class OtherModelView(MyBaseListView):
    <b>model = OtherModel</b>
    resume_info = 'other_info'

Таким образом, мы можем использовать наследование для определения общих вещей только один раз и использовать его в нескольких представлениях.Если нам нужно что-то изменить в конкретном представлении, мы можем переопределить это на этом уровне.

В urls.py вы определяете такое представление с помощью .as_view()метод [Джанго-док] .Например:

# app/urls.py

from django.urls import path
from app.views import EducationalResumeView, OtherModelView

urlpatterns = [
    path('education/', EducationalResumeView<b>.as_view()</b>),
    path('other/', OtherModelView<b>.as_view()</b>),
]
...