Как связать AbstractUser с Группой и запросить в Views для Business Logic - PullRequest
0 голосов
/ 11 июля 2019

Я ограничил количество файлов, которые пользователь может загрузить на мой сайт с помощью логического запроса в файле views.py моего приложения для загрузки.Короче говоря, после того, как пользователь загрузил 5 файлов, они перенаправляются на страницу, которая говорит, что они должны стать премиум-участником.

Сейчас я пытаюсь добавить к этой логике, проверив, находятся ли они в группе «Свободный пользователь».Если это не так, им должно быть разрешено загружать неограниченное количество файлов.

До сих пор я использовал админ-панель для создания двух групп.Один - «Бесплатный пользователь», а другой - «Золотой пользователь».

Я дал обеим группам разрешения на добавление, изменение, удаление, просмотр для моего приложения "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 есть поле для group_id, но когда я меняю группу в интерфейсе администратора, нетизменения отражают.

Когда я проверяю таблицу с помощью select * from auth_group, я вижу, что у меня есть идентификатор и имя группы, поскольку я являюсь Free User и Gold User.

Я пытаюсь использовать этот запрос в своей загрузке 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 кстати.

1 Ответ

0 голосов
/ 11 июля 2019

После создания групп в административной панели и проверки наличия связи при выполнении

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/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)








...