Django: Как использовать более 2 базовых представлений на основе классов в одном шаблоне - PullRequest
0 голосов
/ 10 октября 2019

Я пытался создать веб-приложение, в котором пользователь мог бы видеть другие сообщения при обновлении сообщения. Итак, для этого я хочу использовать оба ListView и UpdateView вместе в одном шаблоне.

My Views.py:

from django.shortcuts import render
from .models import Entry
from django.views.generic import ListView
from django.views.generic.edit import UpdateView
from django.contrib.auth.models import User
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin


class index(LoginRequiredMixin, ListView):
    template_name = 'diary/index.html'
    context_object_name = 'entries'

    def get_queryset(self):  # def get_queryset(self, request):
        return Entry.objects.filter(author=self.request.user)


class EntryUpdate(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Entry
    fields = ['title', 'content']

    template_name = 'diary/update.html'

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        else:
            return False

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

Любая помощь будет оценена!

РЕДАКТИРОВАТЬ:

Мой код ListView в views.py:

class index(LoginRequiredMixin, ListView):
    template_name = 'diary/index.html'
    context_object_name = 'entries'

    def get_queryset(self):
        return Entry.objects.filter(author=self.request.user)

Мой UpdateView в views.py:

class EntryUpdate(LoginRequiredMixin, MultipleObjectMixin,UserPassesTestMixin, UpdateView):
    model = Entry
    fields = ['title', 'content']
    template_name = 'diary/update.html'

    def get_queryset(self):
        return Entry.objects.filter(author=self.request.user)

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        else:
            return False

Ошибка, которую я получаю:

'EntryUpdate' object has no attribute 'object_list'

1 Ответ

1 голос
/ 10 октября 2019

Возможно, вы можете попробовать MultipleObjectMixin в вашем UpdateView.

Вы можете определить с помощью этого миксина get_queryset() и получить доступ к object_list в шаблоне. Проверьте документацию для получения дополнительной информации

РЕДАКТИРОВАТЬ

Конечно, вот краткий пример кода:

# demo/models.py

from django.db import models

class Title(models.Model):
    title = models.CharField(max_length=100)
# demo/views.py

from django.views.generic import UpdateView
from django.views.generic.list import MultipleObjectMixin
from demo.models import Title


class UpdateWithListView(UpdateView, MultipleObjectMixin):
    model = Title
    template_name_suffix = '_update_form_with_list'
    fields = ['title']
    object_list = Title.objects.all()

update_with_list_view = UpdateWithListView.as_view()
# my_project/urls.py

from django.contrib import admin
from django.urls import path
from demo.views import update_with_list_view

urlpatterns = [
    path('<int:pk>', update_with_list_view),
    path('admin/', admin.site.urls),
]

И шаблон:

demo/templates/demo/title_update_form_with_list.html


Current title: {{ object.title }}

<form method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Update">
</form>

<p>All other titles:</p>

{% for title in object_list %}
<p>Title:  {{ title.title }}</p>
{% endfor %}

И это то, что я получил в шаблоне (у меня было 10 «заголовков» в моей БД, каждый со случайнымсимвол):

UpdateView with MultipleObjectMixin

РЕДАКТИРОВАТЬ 2 Что касается вашего отредактированного вопроса, вам не хватает определения "object_list" в вашем представлении,что требуется для MultipleObjectMixin.

Обратите внимание, что в моем примере кода в views.py я определяю object_list с помощью запроса, который будет заполнять object_list. Я считаю, что ошибка, которую вы получаете, заключается в том, что миксин ожидает получения object_list.

Пожалуйста, попробуйте добавить:


# demo/views.py

# omitted imports


class UpdateWithListView(UpdateView, MultipleObjectMixin):
    model = Title
    template_name_suffix = '_update_form_with_list'
    fields = ['title']
    object_list = Title.objects.all() # make sure to define this with your query

update_with_list_view = UpdateWithListView.as_view()

Если я не ошибаюсь, get_queryset()метод заботится о поиске объекта для UpdateView, в то время как object_list относится к ListView.

. Пожалуйста, попробуйте добавить object_list к вашему представлению и проверьте, решает ли это проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...