简体   繁体   English

django CreateView在重新运行服务器之前不会显示在ListView上

[英]django CreateView doesn't show on ListView until rerun the server

I am trying to create an object using CreateView 我正在尝试使用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

It works. 有用。 However, when I jump into the ListView Part, I need to rerun 但是,当我跳到ListView部分时,我需要重新运行

python manage.py runserver

to make the new item show on the list. 使新项目显示在列表中。

I want to make it work without rerun the server. 我想使其工作而无需重新运行服务器。 Thanks! 谢谢!

Below is my ListView code 下面是我的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

In this case, you should only use get_queryset() not queryset in your ListView . 在这种情况下,您应该仅在ListView使用get_queryset()而不是queryset queryset only runs the very first time your server starts while get_queryset() works every time a request is made, that's why you only see the new element in the ListView when you rerun python manage.py runserver . queryset仅在服务器第一次启动时运行,而get_queryset()每次发出请求时都会运行,这就是为什么在重新运行python manage.py runserver时仅在ListView中看到新元素的原因。

An alternative solution could be: 替代解决方案可以是:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM