TIL Day 63.

Jen Devver·2024년 5월 16일

내배캠 TIL

목록 보기
70/91

Django 최종 팀 프로젝트

admin 페이지 커스터마이즈

  • admin 페이지에서 유저 CRUD 구현: CRUD 의 경우 따로 views.py를 구성해주지 않아도 admin에서 가능함. 대신 User model 을 상속받아 수정해주는 코드가 따로 필요할 것.
  • admin 페이지에서 메뉴 CRUD 구현: 이 역시 CRUD 를 따로 views.py를 구성해주지 않아도 됨. 대신 models.py에서 모델을 구성해주어야 함.
    models.py
from django.db import models
from django.contrib.auth.models import User


class Menu(models.Model):
    name = models.CharField(max_length=20)
    price = models.PositiveIntegerField()
    user = models.ForeignKey(User, on_delete=models.CASCADE)

   def __str__(self):
        return f"{self.name} - {self.price}`

admin.py

from django.contrib import admin
from .models import Menu


@admin.register(Menu) ### 데코레이터를 통해 admin에 등록해줌
class MenuAdmin(admin.ModelAdmin):
    readonly_fields = ('user',)
    list_display = ("name", "price")
    search_fields = ("name", "price")
    # list_filter = ("name", "user")
    # date_hierarchy = "created_at"
    # ordering = ("-created_at",)

   def save_model(self, request, obj, form, change): ## 작성한 menu를 로그인한 해당 user에 따라 저장
        obj.user = request.user
        username_id = obj.user.id
        super().save_model(request, obj, form, change)

   def get_queryset(self, request): ## 전체 메뉴를 보여줄 대상을 지위에 따라 지정함 (superuser의 경우 모든 user의 메뉴를 볼 수 있고, staff의 경우 본인으로 filter된 메뉴만 볼 수 있음)
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(user=request.user)

   def get_list_filter(self, request): ## 필터를 보여줄 대상을 지위에 따라 지정함 (superuser의 경우 name, user 필터를 볼 수 있고 staff의 경우 name 필터만 볼 수 있음)
        if request.user.is_superuser:
            list_filter = ("name", "user")
        else:
            list_filter = ("name",)
        return list_filter

superuser의 경우
admin 메인 페이지

메뉴를 전부 보는 것 가능

유저 관리 가능

staff의 경우

staff 메인 페이지

본인이 작성한 메뉴만 조회 가능

user는 수정 불가능

  • (추후 추가 가능) admin 페이지 프론트엔드를 권한에 따라 커스텀
    admin.py
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin



class StaffAdminSite(admin.AdminSite):
    site_header = "점주 admin"
    site_title = "점주 admin"
    index_title = "점주의 admin 입니다."


staff_admin_site = StaffAdminSite(name="staff_admin"`

헤더와 타이틀 등 바뀐 것을 볼 수 있음

profile
발전 중...

0개의 댓글