اعمال دسترسی و permission وقتی با django و htmx کار می کنید
اگر در قسمت ادمین django یوزر درست کرده باشید دیده اید که می توان برای هر کاربر و هر گروه از کاربران روی هر کلاسی که داخل models تعریف کرده اید دسترسی تعریف کنید: هر کاربر می تواند دسترسی add , delete , change or view روی هر مدل تعریف شده داشته باشد.
یکی از روشهای اعمال دسترسی کاربران به داده ها همین است.
برای این کار در همین قسمت ادمین دسترسی ها را تعریف می کنید.
بعد در views.py ، دسترسی ها را مشخص می کنید: اگر از class-based-views استفاده می کنید باید PermissionRequiredMixin و اگر از function-based-views استفاده می کنید @permission_required را به کار ببرید.
به عنوان مثال
class RouteListView(PermissionRequiredMixin, ListView): permission_required = ["transport.view_route"] model = Route class RouteCreateView(PermissionRequiredMixin, CreateView): permission_required = ["transport.add_route"] model = Route fields = ['source', 'destination', 'date'] template_name = "transport/route-create.html" success_url = reverse_lazy("route-list")
نام مدل من در اینجا route و نام اپلیکیشن من transport بوده است.
حالا وقتی کاربری که permission کافی ندارد بخواهد به این view ها دسترسی داشته باشد خطای 403 میگیرد. بطور عادی خود django یک پیام
403 Forbidden
به کاربر نشان می دهد.
البته اگر از htmx استفاده می کنید چنین پیامی را نخواهید دید و پیام خطا فقط در terminal دیده می شود.
کاربر هم در واقع هیچ تغییری در صفحه نمی بیند. چون htmx یک پیام خطای دیگر Raise می کند. اگر بخواهید باید آن را مدیریت کنید.
اما طبیعتا بهتر است شما اصلا لینکهای صفحات و viewهایی که کاربر به آن دسترسی ندارد را به او نشان ندهید نه اینکه لینک را نشان دهید و بعد
پیام خطا بدهید.
برای این کار در template باید از ساختار {% if perms.foo.add_vote %} استفاده کنید.
به عنوان مثال
{% if perms.trasnport.add_route or perms.trasnport.view_route %} <div class="list-group shadow-sm small mb-3"> <div class="list-group-item active">لیست مسیر ها</div> {% if perms.trasnport.add_route %} <a href="#" class="list-group-item list-group-item-action" hx-get="{% url 'route-create' %}" hx-trigger="click" hx-target="#content" hx-swap="innerHTML" data-bs-target="#surveyCreateModal">ایجاد مسیر</a> {% endif %} {% if perms.trasnport.view_route %} <a href="#" class="list-group-item list-group-item-action" hx-get="{% url 'route-list' %}" hx-trigger="click" hx-target="#content" hx-swap="innerHTML" data-bs-target="#surveyCreateModal">لیست مسیرهای</a> {% endif %} </div> {% endif %}