인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

하동원님의 프로필 이미지
하동원

작성한 질문수

작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지

WYSIWYG 의 소개 및 적용

질문이요~

작성

·

171

1

Article 수정하거나 만들때,

project 선택하는 부분에서요

project = 
forms.ModelChoiceField(queryset=Project.objects.all(), required=False)



내가 만든 Project만 선택하게 하고싶은데

queryset안에서 filter 처리 하기 위한 데이터를 가져오고싶은데

form안에서는 가져올수 없나요?

예를들어 view에서는 requset.user로 user 정보를 가져올수있는 것처럼요

답변 1

0

Hyong Sok Park님의 프로필 이미지
Hyong Sok Park
지식공유자

안녕하세요 하동원님!

다시 커스터마이징 관련 질문이네요!

물론 질문주신 문제를 해결하는 여러 방법이 있겠지만
제 나름대로 편한 형식으로 답변을 드리겠습니다.

일단 queryset를 수정하는것이 주요한 목표입니다.
현재 설정되어있는 Project.objects.all() 으로는 모든 프로젝트들이 선택지에 노출되기 때문에,
해당 쿼리셋을 수정해주는것이 필수적입니다.

그래서 저는 get_form 메서드를 오버라이딩 해서 해당 내용을 구현해보겠습니다.


class
ArticleCreateView(CreateView):
model = Article
form_class = ArticleCreationForm
template_name =
'articleapp/create.html'

...

def get_form(self, form_class=None):
form =
super(ArticleCreateView, self).get_form()
form.fields[
'project'].queryset = Project.objects.filter(creator_id=self.request.user.id)
return form

이런식으로 CreateView 내부의 get_form 을 오버라이딩 해줍니다.

간단하게 설명을 하자면, form 을 가져오는 get_form 메서드가 있는데,
해당 form을 가로채서 form 내부의 project queryset을 수정해준 이후 다시 되돌려주는 방식입니다.

결과적으로 사용자에게는 필터링된 project들만 보여지게 되겠죠?

원래 다른 방법으로 한 내용을 답변 달아드렸는데,
해보니까 필터링은 되는데 제대로 작성이 되지 않더라구요 ㅠ

다른 방법으로 해서 답변 다시 남겨드립니다.
이 답변도 꼭 정답이 아니라, 다른 방법으로도 구현이 가능하다는점 알아주시구요!

아무튼 답변이 도움이 되셨으면 좋겠네요!
부족하다면 계속 질문 남겨주시고 오늘도 좋은하루 보내시길 바래요~

하동원님의 프로필 이미지
하동원
질문자

선생님 감사합니다

get_form이란게 있었군요.

다양한 메소드가  있는 걸 보니 

cdn을 읽으면서 공부해야겠어요.

바쁘신데 감사합니다!

하동원님의 프로필 이미지
하동원

작성한 질문수

질문하기