완숙의 블로그

admin.py, models.py, resister 본문

Programing Language/Web_Django

admin.py, models.py, resister

완숙 2020. 1. 10. 12:21

admin.py

장고의 admin 패널을 사용할 수 있게 된다.

@admin.register(models.Room)
class RoomAdmin(admin.ModelAdmin):
    """ Room admin Definition """

    fieldsets = (
        (
            "Basic Info",
            {"fields": ("name", "description", "country", "address", "price")},
        ),
        ("Times", {"fields": ("check_in", "check_out", "instant_book")}),
        ("Spaces", {"fields": ("guests", "beds", "bedrooms", "baths",)}),
        (
            "More About the Space",
            {
                "classes": ("collapse",),
                "fields": ("amenities", "facilities", "house_rules",),
            },
        ),
        ("Last Details", {"fields": ("host",)}),
    )

    list_display = (
        "name",
        "country",
        "city",
        "price",
        "guests",
        "beds",
        "bedrooms",
        "baths",
        "check_in",
        "check_out",
        "instant_book",
        "count_amenities",
        "count_photos",
    )

    # ordering = ("name", "price", "bedrooms")

    list_filter = (
        "instant_book",
        "host__superhost",
        "room_type",
        "amenities",
        "facilities",
        "house_rules",
        "city",
        "country",
    )

    search_fields = ("=city", "^host__username")

    filter_horizontal = (
        "amenities",
        "facilities",
        "house_rules",
    )

    def count_amenities(self, obj):
        return obj.amenities.count()

    def count_photos(self, obj):
        return obj.photos.count()

    # count_amenities.short_description = "hello sexy!"

Resister

이녀석은 이 구문 밑에 나오는 함수에 resister에 넣었던 파마미터를 넣어주는 역할을 한다.

보다 직관적으로 사용할 수 있다.

 

 

FieldSet

admin 패널을 사용할 때, 보여지는 방식에 대한 것이다.

그룹화 하여 보기 좋게 만들어 준다.

 

 

List Display, list filter

이녀석은 admin 패널을 사용할 때, database처럼 column을 만들어주는 역할을 한다.

filter는 기본적으로 오른쪽에 필터를 만들어준다.

 

 

 

 

Search Field

이건 search bar를 만들어주는 것을 말한다.

이 때 검색 조건을 다르게 할 수 있는데, 그것이 앞에 붙는 ^,=와 같은 것이다.

자세한 것은 doc를 확인하자.

 

 

 

filter_horizontal

filter_horizontal이 없을 때 기본 세팅
filter_horizontal 사용 후

 

 

Ordering

기본적인 표의 정렬 순서를 설정해준다.

 

 

추가적으로 만든 함수

이 함수의 파라미터는 obj이라는 것이 들어온다.

obj는 admin 패널에서 상속하여 사용하는, 모델의 한 row 객체를 의미한다.

따라서 우리는 그 안에서 쿼리셋을 사용할 수 있다.

 

 

 

 

Models.py

class Room(core_models.TimeStampedModel):
    """ Room Model Definition """

    # 필수 입력 사항임
    name = models.CharField(max_length=140)
    description = models.TextField()
    country = CountryField()
    city = models.CharField(max_length=80)
    price = models.IntegerField()
    address = models.CharField(max_length=140)
    guests = models.IntegerField()
    beds = models.IntegerField()
    bedrooms = models.IntegerField()
    baths = models.IntegerField()
    check_in = models.TimeField()
    check_out = models.TimeField()
    instant_book = models.BooleanField(default=False)
    # host = models.ForeignKey(user_models.User, on_delete=models.CASCADE)
    host = models.ForeignKey(
        "users.User", related_name="rooms", on_delete=models.CASCADE
    )
    room_type = models.ForeignKey(
        "RoomType", related_name="rooms", on_delete=models.SET_NULL, null=True
    )
    amenities = models.ManyToManyField("Amenity", related_name="rooms", blank=True)
    facilities = models.ManyToManyField("Facility", related_name="rooms", blank=True)
    house_rules = models.ManyToManyField("HouseRule", related_name="rooms", blank=True)

    def __str__(self):
        return self.name

    def total_rating(self):
        self.reviews.

여기서 함수를 보면 obj가 없다.

 

모델 안에서는 self 자체가 한 row를 의미하는 것이기 때문이다.

 

 

차이점

admin 패널에서만 보여질 변수라면 admin.py에서 함수를 작성하는 것이 맞고,

파생적으로 나온 변수를 다른 곳에서도 사용할 것이라면 models.py에 작성하는 것이 맞다.

Comments