Список и форма в одном и том же шаблоне django - PullRequest
0 голосов
/ 26 ноября 2018

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

Я сделал так, как показано ниже, но это не такРешение ... Это довольно грязно.

Есть ли у вас лучший подход?

views.py


def post_list(request):

    # Pull relevant posts from the database
    posts = Post.objects.filter(status='Published').order_by('-created')
    return posts


def home_page(request):

    # Contact form logic
    if request.method == 'GET':
        form = ContactForm()
    else:
        form = ContactForm(request.POST)
        if form.is_valid():
            name = form.cleaned_data['name']
            from_email = form.cleaned_data['from_email']
            message = form.cleaned_data['message']
            try:
                send_mail(name, message, from_email, ['admin@example.com'])
            except BadHeaderError:
                return HttpResponse('Invalid header found')
            messages.success(request, 'Mesage delivered')

    # Call the post_list() function
    posts = post_list(request)

    # Stuff it all into the home page template
    context = {'posts':posts, 'form':form}
    return render(request, "home.html", context)    

1 Ответ

0 голосов
/ 26 ноября 2018

Если вы сохраняете все это чисто Джанго, тогда ваш подход на самом деле хорош.За исключением того, что функция post_list не должна быть определена в views.py, поскольку она действительно не является функцией представления.

Лучше было бы создать Post пользовательский менеджер моделей с пользовательскимметод published(), чтобы в вашей home_page функции просмотра вы могли просто выполнить:

posts = Post.objects.published()

Методы published() «знают», как фильтровать правильные сообщения и упорядочивать их соответствующим образом.В будущем он может даже возвращать разные списки в зависимости от того, имеет ли пользователь определенные привилегии, например, возвращать также сообщения, которые будут опубликованы в будущем для сотрудников.

Эта логика принадлежит модели (или менеджеру модели в данном случае), а не представлению.

Другой подход, особенно когда вы начинаете работать с более сложными представлениями, которые требуют фрагментов информации извсе виды различных мест, это создание представления API для списка сообщений, которые выбираются через JavaScript с помощью вызова ajax.Тогда вашей функции home_page() нужно только вернуть визуализированный HTML-шаблон с формой, и javascript будет извлекать список сообщений отдельно.Сложнее, потому что вы должны заполнить шаблон с помощью JavaScript.Вот для этого и нужны такие фреймворки, как React или Angular.

...