如何 link AbstractUser 在业务逻辑视图中进行分组和查询

How to link AbstractUser to Group and query in Views for Business Logic

我在上传应用程序的 views.py 文件中使用逻辑查询限制了用户可以上传到我网站的文件数量。长话短说,在用户上传了 5 个文件后,他们被重定向到一个页面,上面写着他们必须成为高级会员。

我现在正尝试通过检查他们是否在 "Free User" 组中来添加该逻辑。如果不是,则应允许他们上传不限数量的文件。

到目前为止,我已经使用管理面板创建了两个组。一种是 "Free User",一种是 "Gold User"。

我给两个组添加、更改、删​​除、查看我的 "beatupload" 应用程序的权限。

我将此代码添加到我的用户 models.py

# users/models.py
from django.contrib.auth.models import AbstractUser, Group
from django.db import models

class CustomUser(AbstractUser):
    pass
    # add additional fields in here
    group = models.ForeignKey(Group, on_delete=models.CASCADE, default=1)


    def __str__(self):
        return self.email

我看到我的 users_customuser table 中有一个用于 group_id 的字段,但是当我在管理界面中更改组时,没有任何更改反映出来。

当我使用 select * from auth_group 检查 table 时,我看到我有 ID 和组名,分别是免费用户和金牌用户。

我正在尝试在我的上传中使用此查询 views.py:

class uploadNew(CreateView): # new
    model = beat
    fields = ['title', 'beat']

    success_url = reverse_lazy('uploads')


    #Check number of beats uploaded by user and if exceeds require signup


    def get_template_names(self):
        if (beat.objects.filter(producer=self.request.user).count() <= 4 and user.groups.filter(name='Free User').exists()):
            return ['uploadNew.html',]
        else:
            return ['becomeMember.html',]

    # END CHECK #
    def form_valid(self, form):
        form.instance.producer = self.request.user
        return super(uploadNew, self).form_valid(form)

所以不知何故我没有将我的自定义用户正确链接到组,也没有检查用户属于哪个组以允许无限制上传或要求成为金牌用户。

如果您需要查看更多代码,请告诉我,并在可能的情况下为初学者进行解释,并指出我在哪些方面可能较弱,需要阅读 Django 文档中的更多内容。顺便说一句,我在2.2.2。

在管理面板中创建组并在执行时验证关系存在后

SELECT * from users_customuser_groups;

我能够使用以下代码获得预期的结果:

if (beat.objects.filter(producer=self.request.user).count() == 5 and self.request.user.groups.filter(name="Free User").exists()):

我的完整模型代码贴在下面以供参考。应用程序名称是 'users'

# users/models.py
from django.contrib.auth.models import AbstractUser, Group
from django.db import models

class CustomUser(AbstractUser):
    pass
    # add additional fields in here
    group = models.ForeignKey(Group, on_delete=models.CASCADE, default=1)


    def __str__(self):
        return self.email



观看次数:

#beatupload/views.py
from django.shortcuts import render
from django.views.generic import ListView, CreateView
from django.urls import reverse_lazy

from .forms import beatUploadForm #new
from .models import beat


# Create your views here.
class UploadView(ListView):
    model = beat
    template_name = 'uploads.html'
    def get_queryset(self):
        return beat.objects.filter(producer=self.request.user)

class uploadNew(CreateView): # new
    model = beat
    fields = ['title', 'beat']

    success_url = reverse_lazy('uploads')
    #Check number of beats uploaded by user and if exceeds amount require signup
    #To render sign up template if true and proceed to upload if false

    def get_template_names(self):
        if (beat.objects.filter(producer=self.request.user).count() == 5 and self.request.user.groups.filter(name="Free User").exists()):
            return ['becomeMember.html',]
        else:
            return ['uploadNew.html',]

    # END CHECK #
    def form_valid(self, form):
        form.instance.producer = self.request.user
        return super(uploadNew, self).form_valid(form)