Как ограничить видимость модели для юзера?
Как сделать чтоб только создатель модели мог ее видеть , а другие участники ее не могли видеть, то-есть человек который создал модель мог только он ее видеть со своего аккаунта, а с другого аккаунта человек видел только свое
у меня есть модель 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