Я пытаюсь показать кнопку, если вошедший в систему пользователь имеет необходимые разрешения.
Код в шаблоне:
{% if perms.django_apo_training.can_add %}
<a href="{% url 'training:trainee_add' %}">
<button type="button" class="btn btn-success">Add Trainee</button>
</a>
{% endif %}
Я могу распечатать на веб-странице для отладки, что разрешения, которые пользователь имеет:
<p> {{ perms.django_apo_training }} </p>
Показывает:
{'training.view_trainee', 'training.add_trainee', 'training.delete_trainee', 'training.change_trainee'}
, но
perms.django_apo_training.can_add
всегда возвращает false, не уверен, что мне не хватает?
Даже дважды проверил в консоли администратора:

(если я предоставлю статус суперпользователя данному пользователю, то Если оператор работает и возвращает true?)
Вот модель для стажера
# Create your models here.
class Trainee(models.Model):
objects = models.Manager()
first_name = models.CharField(max_length=200)
last_name = models.CharField(max_length = 200)
institution = models.CharField(max_length=200, blank=True)
contact_phone = models.CharField(max_length=50, blank=True)
contact_email = models.CharField(max_length=100, blank=True)
trained_date = models.DateField('date trained')
class Meta:
ordering = ['institution']
def __str__(self):
return "Trainee: " + str(self.first_name) + " " + str(self.last_name) + " " + str(self.institution)
Во-вторых ... даже если это работает, как я могу убедиться, что только те, кто с этим разрешение и вход в систему можно получить (это намного больше, чем требуется @login декоратор)
http://localhost:8000/training/add/
Наконец: я также создал модель для расширения пользовательской модели с использованием модели один-к-одному:
user = models.OneToOneField(User, on_delete=models.CASCADE)
Внутри этой модели APOUser я ее называю, у меня есть другие поля, которые я бы полюбил , чтобы набрать кроме этих разрешений (в частности, что содержится в on_site_status
), есть ли какой-то заданный способ или пример / рецепт того, как можно это сделать? (полная модель здесь)
class APOUser(models.Model):
objects = models.Manager()
user = models.OneToOneField(User, on_delete=models.CASCADE)
institution = models.ForeignKey("mainpage.Institution", on_delete=models.SET_NULL, null=True)
on_site_status = models.ForeignKey("mainpage.SiteStatus", on_delete=models.SET_NULL, null=True)
refer_to_as = models.TextField(max_length = 30, blank=True, null=True) #if the above is custom
room_preference = models.ForeignKey("housing.Room", on_delete=models.SET_NULL, null=True)