代码之家  ›  专栏  ›  技术社区  ›  anjanesh

在CreateView中添加自定义逻辑,以在满足条件时不显示添加窗体

  •  0
  • anjanesh  · 技术社区  · 5 年前

    如何在基于类的视图中添加自定义逻辑?

    urls.py: path('books/add', views.AddBook.as_view(), name='add_book'),

    型号.py

    class Book(models.Model):    
        title = models.CharField(max_length=255)
        summary = models.TextField(max_length=2048)
        created = models.DateTimeField(auto_now_add=True)
        user = models.ForeignKey(User, on_delete=models.CASCADE)
    

    视图.py

    MAX_BOOKS = 5
    class AddBook(LoginRequiredMixin, generic.CreateView):
        model = Book
        
        """
        if user has reached MAX_BOOKS
        
        books = Book.objects.filter(user=request.user)
        if len(books) == MAX_BOOKS
            template_name = 'books/restrict_book.html'
            and send in some data like { 'error_msg': 'You cannot add further books' }
        """
    
        form_class = BookForm
        # fields = ['title']
        template_name = 'books/add_book.html'
        success_url = reverse_lazy('dashboard')
    
        def form_valid(self, form):
            form.instance.user = self.request.user
            super(AddBook, self).form_valid(form)
            return redirect('dashboard')
    
    1 回复  |  直到 5 年前
        1
  •  0
  •   arjun    5 年前

    您可以使用 count() 方法对queryset进行计数并与最大books值进行比较。

    def form_valid(self, form):
        if Book.objects.filter(user=self.request.user).count() >= MAX_BOOKS:
            return render(self.request, 'books/restrict_book.html')
        form.instance.user = self.request.user
        return super(AddBook, self).form_valid(form)

    编辑:如果您想在提交表单前达到图书数量限制的情况下呈现另一个模板,您可以覆盖 get 方法。

    def get(self, request, *args, **kwargs):
       if Book.objects.filter(user=request.user).count() >= MAX_BOOKS:
            return render(request, 'books/restrict_book.html')
       return render(request, self.template, {'form':self.form_class()})