【问题标题】:Django CreateView - only allow n number of objects created. Redirect if limit is reachedDjango CreateView - 只允许创建 n 个对象。达到限制时重定向
【发布时间】:2020-04-15 04:38:44
【问题描述】:

感谢您花时间阅读本文。

我正在使用 Django 制作一个简单的 CRM 应用程序。这是我的模型。

models.py

class Contact(models.Model):
    contact_owner = models.ForeignKey(get_user_model(), on_delete=models.CASCADE,)
    first_name = models.CharField(max_length = 30)
    last_name = models.CharField(max_length = 30)
    contact_id = models.AutoField(primary_key=True)
    date_created = models.DateTimeField(auto_now_add=True)

这是我的观点,允许用户创建联系人。

views.py

class CreateContact(LoginRequiredMixin, CreateView):
    model = Contact
    template_name = 'network/contacts_list.html'
    form_class = ContactForm

    def get_success_url(self):
        return reverse('home')

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

    def get_context_data(self, **kwargs):
        context = super(CreateContact, self).get_context_data(**kwargs)
        context['contacts'] = Contact.objects.filter(contact_owner=self.request.user)
        return context

我正在尝试限制用户可以创建的联系人数量。在写这个问题之前,我已经研究了一些实现这一目标的方法。

  1. 使用重定向视图。它似乎只适用于 GET 请求。据我了解,在我的问题情况下,提交了 POST 请求。所以这行不通。

  2. 使用 form_invalid。我认为如果请求失败,我可以使用此功能将我重定向到页面。我不知道如何在 form_invalid 函数中传递 url。我不认为那是它的目的。

本质上,我认为我需要在 CreateView 查询中的某处添加一个计数语句,如果它大于 200,则反向('somewhere-else')。我不知道如何在 CreateView 中做到这一点,而且我对基于函数的视图非常不熟悉。

非常感谢您花时间阅读本文。我真的很珍惜你的时间。

如果您有任何问题或需要任何进一步的上下文,请告诉我。

【问题讨论】:

    标签: django django-templates django-views


    【解决方案1】:

    覆盖CBV的post(...)方法,

    from django.http.response import HttpResponseRedirect
    from django.urls import reverse
    
    
    class CreateContact(LoginRequiredMixin, CreateView):
        # other code
    
        def is_limit_reached(self):
            return Contact.objects.filter(contact_owner=self.request.user).count() >= 100
    
        def post(self, request, *args, **kwargs):
            if self.is_limit_reached():
                return HttpResponseRedirect(reverse('somewhere-else'))
            else:
                return super().post(request, *args, **kwargs)

    【讨论】:

    • 我知道我们不应该在 cmets 中说谢谢之类的话,但这就是我今天要做的事情。这是如此干净和如此简单,并将在我未来的项目中帮助我。我非常感谢您的帮助!对于将来阅读本文的任何人,上面的代码都可以完美运行。
    猜你喜欢
    • 1970-01-01
    • 2016-03-04
    • 2021-11-26
    • 1970-01-01
    • 2019-06-06
    • 2012-10-07
    • 2019-03-20
    • 1970-01-01
    • 2019-04-17
    相关资源
    最近更新 更多