기존에 시험 삼아 만들었던 Django Admin을 우리 프로젝트에 맞게 수정해 기능 구현
null=True, blank=True를 넣어주어 해시태그를 일단 생성한 뒤 메뉴 작성 시 선택가능하도록 수정@admin.register(Menu)
class MenuAdmin(admin.ModelAdmin):
def get_form(self, request, obj, **kwargs):
form = super(MenuAdmin, self).get_form(request, obj, **kwargs)
# print("form>>>>>>>>>>>", form)
# print("dir>>>>>>>>>>>>>>>", dir(form)) #### 내부를 볼 수 있음..!!
# print("base_fields >>>>>>>>>> ", form.base_fields)
if request.user.is_superuser:
form.base_fields['hashtags'].queryset = Hashtag.objects.all()
elif request.user.is_staff:
form.base_fields['hashtags'].queryset = Hashtag.objects.filter(hashtag_author_id=request.user)
return form
get_form() 함수를 오버라이드해서 조건문으로 분기 처리해 줌.
여기서 print()문의 경우 튜터님께서 도와주신 흔적..
formfield_for_foreignkey() 를 사용하려고 했는데 이 함수 자체를 타지 않음. 왜..?HashtagAdmin에서 readonly_fields=("hashtag_authors",) 를 추가해주어 수정 불가하도록 하고, save_model() 함수를 오버라이드해서 로그인한 작성자의 이름이 자동으로 입력되도록 수정## 메뉴에서 해당 메뉴의 해시태그를 모두 조회
@admin.register(Menu)
class MenuAdmin(admin.ModelAdmin):
readonly_fields = ("store", "store_id")
list_display = ("food_name", "price", "get_hashtags")
search_fields = ("food_name", "price")
def get_hashtags(self, obj):
return ", ".join([hashtag.hashtag for hashtag in obj.hashtags.all()])
get_hashtags.short_description = "Hashtags" ## 리스트에서 테이블 헤드 역할
## 해시태그에서 해당 해시태그를 가진 메뉴들 조회
@admin.register(Hashtag)
class HashtagAdmin(admin.ModelAdmin):
readonly_fields = ("hashtag_author",)
list_display = ("hashtag", "hashtag_author", "get_menus")
list_filter = ("hashtag_author",)
def get_menus(self, obj):
return ", ".join([menu.food_name for menu in obj.menu_items.all()])
get_menus.short_description = "Menus" ## 리스트에서 테이블 헤드 역할
@admin.register(Menu)
class MenuAdmin(admin.ModelAdmin):
def get_form(self, request, obj, **kwargs):
form = super(MenuAdmin, self).get_form(request, obj, **kwargs)
# print("form>>>>>>>>>>>", form)
# print("dir>>>>>>>>>>>>>>>", dir(form)) #### 내부를 볼 수 있음..!!
# print("base_fields >>>>>>>>>> ", form.base_fields)
if request.user.is_superuser:
form.base_fields['hashtags'].queryset = Hashtag.objects.all()
elif request.user.is_staff:
form.base_fields['hashtags'].queryset = Hashtag.objects.filter(hashtag_author_id=request.user)
return form
이 코드에서 주석 처리된 부분이 튜터님께 질문하러 갔을 때 단계 별로 도와주신 부분.
원래 return super().get_form(request, obj, **kwargs) 로 써 두었는데
1. form 으로 super().~ 부분을 받아줌
2. form이 잘 받아와지는지 프린트로 찍어봄
form>>>>>>>>>>> <class 'django.forms.widgets.MenuForm'>
dir() 함수를 프린트 해 봄dir>>>>>>>>>>>>>>> ['Meta', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__html__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_bound_items', '_clean_fields', '_clean_form', '_get_validation_exclusions', '_html_output', '_meta', '_post_clean', '_save_m2m', '_update_errors', '_widget_data_value', 'add_error', 'add_initial_prefix', 'add_prefix', 'as_div', 'as_p', 'as_table', 'as_ul', 'base_fields', 'changed_data', 'clean', 'declared_fields', 'default_renderer', 'errors', 'field_order', 'full_clean', 'get_context', 'get_initial_for_field', 'has_changed', 'has_error', 'hidden_fields', 'is_multipart', 'is_valid', 'media', 'non_field_errors', 'order_fields', 'prefix', 'render', 'save', 'template_name', 'template_name_div', 'template_name_label', 'template_name_p', 'template_name_table', 'template_name_ul', 'use_required_attribute', 'validate_unique', 'visible_fields']
어떤 함수가 해당될 지 확인. 여기서 튜터님은 hashtag가 있는지 여쭤보셨고, 없으니 base_fields 를 보아야 할 것 같다고 하심
base_fields 를 프린트 해봄
base_fields >>>>>>>>>> {'food_name': <django.forms.fields.CharField object at 0x10787e4a0>, 'price': <django.forms.fields.IntegerField object at 0x10787e650>, 'hashtags': <django.forms.models.ModelMultipleChoiceField object at 0x10787e740>}
food_name, price, hashtags 여서 form의 base_fields 에서 hashtags를 쿼리셋으로 하고, Hashtag.objects.all()로 모든 해시태그를 불러오거나 Hashtag.objects.filter(hashtag_author_id=request.user) 로 해당되는 유저가 작성한 해시태그만 불러오도록 함.튜터님이 젭으로 보내주신 코드는 form.base_fields['user'].queryset = Hashtag.objects.filter(....) 였고 95% 다 알려주신 거라고 하셨는데 실질적으로는 98% 정도 알려주신 거였다...