Как ограничить видимость модели для юзера?

Как сделать чтоб только создатель модели мог ее видеть , а другие участники ее не могли видеть, то-есть человек который создал модель мог только он ее видеть со своего аккаунта, а с другого аккаунта человек видел только свое

у меня есть модель models.py

class Product(models.Model):
    username = models.CharField(max_length=100)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    email = models.EmailField(max_length=254)
    image = models.ImageField(upload_to='media/', blank=True, null=True)
    company_name = models.CharField(max_length=100)


    def __str__(self):
        return self.username

views.py

class ProductListView(ListView):
    model = Product
    queryset = Product.objects.all()
    template_name = 'products_list.html'


class ProductDetailView(DetailView):
    model = Product

class NewProductView(LoginRequiredMixin,CreateView):
    template_name = 'product_form.html'
    model = Product
    form_class = NewProductForm
    success_url = reverse_lazy('product_list_page')

class EditProductView(LoginRequiredMixin ,UpdateView):
    template_name = 'product_form.html'
    model = Product
    form_class = EditProductForm
    success_url = reverse_lazy('product_list_page')

как сделать чтоб ее видел только ток кто ее создал, чтоб другой пользователь видел только свою модель которую создал он. Как ограничить видимость модели только для его создателя?

django.contrib.auth.mixin содержит класс PermissionRequiredMixin

Добавляете во вьюху его, указываете в has_permission методе доп условие на совпадение юзера.


class EditProductView(LoginRequiredMixin, PermissionRequiredMixin, UpdateView):
    template_name = 'product_form.html'
    model = Product
    form_class = EditProductForm
    success_url = reverse_lazy('product_list_page')

    def has_permission(self)
        has_perm = super().has_permission()
        obj = self.get_object()
        if not (obj.user and self.request.user.is_authenticated and obj.user.pk == self.request.user):
            return False
        return has_perm

Как то так


UPD:


class RegiserModel(models.Model):
    username = models.CharField(max_length=100)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    email = models.EmailField(max_length=254)

    def __str__(self):
        return self.username

class Product(models.Model):
    user = models.CharField(max_length=100)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    email = models.EmailField(max_length=254)
    image = models.ImageField(upload_to='media/', blank=True, null=True)
    company_name = models.CharField(max_length=100)

    def __str__(self):
        return self.user

Не знаю, зачем вам этот велосипед RegiserModel. В Django есть django.contrib.auth.models.User или django.contrib.auth.get_user_model на стандартную модель пользователя.

class Product(models.Model):
    user = models.CharField(max_length=100)

Свять с пользователем делают через models.ForeignKey где указывают модель, где хранятся данные пользователей. По строке искать не вариант, почему - другой вопрос, возможно гугл подскажет. Я ответить не могу, ибо не знаю всех целей вашего проекта.

В общем. Нужно провести рефакторинг кода. Если лень - то в ниже код для вашего варианта

    def has_permission(self)
        has_perm = super().has_permission()
        obj = self.get_object()
        if not (self.request.is_authenticated and obj.user == self.request.user.username):
            return False
        return has_perm
Вернуться на верх