首页 > 解决方案 > 在重新运行服务器之前,django CreateView 不会显示在 ListView 上

问题描述

我正在尝试使用 CreateView 创建一个对象

class PlayerCreate(CreateView):

    template_name = 'form.html'
    model = Player
    form_class = PlayerForm
    header = "Player"

    def get_context_data(self):
        context = super(PlayerCreate, self).get_context_data()
        context['header'] = self.header
        return context

    def form_valid(self, form):
        valid = super(PlayerCreate, self).form_valid(form)
        if not self.request.user.is_staff or not self.request.user.is_superuser:
            return HttpResponse("Only authorized user can edit or create")
        return valid

有用。但是,当我跳入 ListView 部分时,我需要重新运行

python manage.py runserver

使新项目显示在列表中。

我想让它在不重新运行服务器的情况下工作。谢谢!

下面是我的 ListView 代码

class PlayerList(ListView):

    template_name = "list.html"
    header = 'Player'
    queryset = Player.objects.all().order_by("-timestamp")

    def get_context_data(self):
        context = super(PlayerList, self).get_context_data()
        context['header'] = self.header
        return context

    def get_queryset(self):
        query = self.request.GET.get("q")
        if query:
            self.queryset = self.queryset.filter(
            Q(name__icontains=query)
            ).distinct()
            return self.queryset
        else:
            return self.queryset

标签: pythondjango

解决方案


在这种情况下,您应该只get_queryset()queryset您的ListView. queryset仅在您的服务器第一次启动时运行,而 get_queryset() 每次发出请求时都有效,这就是为什么您在重新运行时仅在 ListView 中看到新元素的原因python manage.py runserver

另一种解决方案可能是:

def get_context_data(self):
    context = super(PlayerList, self).get_context_data()
    context['header'] = self.header
    context['players_list'] = Player.objects.all().order_by("-timestamp")
    return context

推荐阅读