۲. مجوزها¶
مجوز کاری است که با یک مدل میشود کرد. Django به هر مدل چهار مجوز میدهد -
view_order، add_order، change_order، delete_order - و کتابخانه همانها را
همانطور که هستند به کار میبرد. فروشگاه به جای آنها مجوزهای خودش را اعلام
میکند، که اسمشان کاری است که انجام میشود:
class Order(models.Model):
class Status(models.TextChoices):
PENDING = 'pending', _('Pending')
APPROVED = 'approved', _('Approved')
REJECTED = 'rejected', _('Rejected')
DELIVERED = 'delivered', _('Delivered')
customer = models.ForeignKey(
Person, on_delete=models.CASCADE, related_name='orders', verbose_name=_('customer')
)
branch = models.ForeignKey(
Branch, on_delete=models.PROTECT, related_name='orders', verbose_name=_('branch')
)
item = models.CharField(_('item'), max_length=120)
status = models.CharField(
_('status'), max_length=16, choices=Status.choices, default=Status.PENDING
)
#: Set by the shop, never by the customer - empty until it is.
price = models.DecimalField(_('price'), max_digits=10, decimal_places=2, null=True, blank=True)
objects = OrderQuerySet.as_manager()
class Meta:
verbose_name = _('order')
verbose_name_plural = _('orders')
default_permissions = ()
permissions = build_permissions(
'order',
_('orders'),
actions=(*DEFAULT_ACTIONS, 'approve'),
labels={'approve': _('Can approve or reject %(resource)s')},
# Only whoever holds shop.order_view_price reads it.
protected_fields=('price',),
# Only whoever may approve writes these, and only from pending.
status_actions={
'approve': {'field': 'status', 'to': ['approved', 'rejected'], 'from': ['pending']},
},
)
def __str__(self):
return f'{self.item} ({self.branch})'
build_permissions اینها را میسازد:
| مجوز | از کجا |
|---|---|
shop.order_view، order_create، order_edit، order_delete |
DEFAULT_ACTIONS |
shop.order_approve |
اکشنی که کنار آنها اضافه شده |
shop.order_view_price، order_edit_price |
فیلد محافظتشده - قدم ۶ |
default_permissions = () چهار مجوز Django را خاموش میکند، تا یک مدل یک
دسته اسم داشته باشد و نه دو دسته؛ مدلی که هر دو را نگه دارد موقع بالا آمدن
پروژه رد میشود (E014). اکشن وضعیت قدم ۷ است.
permission_for(Order, 'edit') به هر دو شکل جواب میدهد، پس هیچ جای دیگری از
پروژه لازم نیست بداند یک مدل کدام را نگه داشته.
در پنل ادمین¶
دسترسی، مجوزها همهی مجوزها را فهرست میکند، و اینکه چه کسی هر کدام را دارد:

مجوزی که وجود دارد تا وقتی کسی آن را ندهد به هیچ کس داده نشده: مجوز تازهای که در یک نسخه اضافه میشود، بدون دارنده میرسد.