수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
프론트엔드 컨셉 궁금합니다.
저렇게 글을 보냈을 때 토큰에서 유저의 정보를 가져와서 글을 입력하거나 이런건 이해가 되겠는데 프론트엔드단에서 현재 로그인 정보가 토큰밖에 없잖아요 게시판을 예로 들면 자기 글일 경우에는 '수정' '삭제' 버튼을 표출하게 하고 싶고 자기글이 아닌경우 이 버튼들을 숨김처리하고싶은데요 이럴 때 토큰만으로 어떻게 이 글이 본인이 쓴거라고 확인할 수 있을까요?
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
안녕하세요 강사님 POSTMAN으로 API를 테스트해보려고 하는데 설정 관련하여 문의드립니다.
- 여러분의 질문을 고대하고 있습니다. :-)- 질문 전에 검색을 먼저 해보세요. 사람 사는 게 다 비슷하다는 것을 알게 됩니다.- 예의는 거침없이 질문하기 위한 최고의 발명품입니다.- 100개의 설명이 스크린샷 한방 보다 못할 수 있습니다.- 코드를 첨부하면 전세계 누구나 이해할 수 있는 질문이 됩니다.- 하나의 질문에는 하나의 주제를 담아야 답변도 예리해집니다.- 시행착오를 알려주시면 곧 바로 원하는 문제에 집중할 수 있습니다.- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 위와 같이 발급받은 토큰을 추가하고, 해당 주소로 요청을 보내면 위와 같은 에러메시지가 발생합니다. 아래는 해당 ViewSet이고요 class PostViewSet(ModelViewSet): queryset = Post.objects.all().filter(is_public=True) permission_classes = [IsAuthenticated,] authentication_classes = [] parser_classes = [MultiPartParser, FormParser] serializer_class = PostSerializer def get_serializer_context(self): context = super().get_serializer_context() context["request"] = self.request return context def get_queryset(self): qs = super().get_queryset() qs = qs.filter( Q(author=self.request.user) | Q(author__in=self.request.user.following_set.all()) ) return qs def perform_create(self, serializer): serializer.save(author=self.request.user, ip=self.request.META['REMOTE_ADDR']) return super().perform_create(serializer) @action(detail=True, methods=["POST"]) def like(self, request, pk): post = self.get_object() post.like_user_set.add(self.request.user) return Response(status.HTTP_201_CREATED) @like.mapping.delete def unlike(self, request, pk): post = self.get_object() post.like_user_set.remove(self.request.user) return Response(status.HTTP_204_NO_CONTENT) 위 POSTMAN 설정이 적용이 안돼는가 싶어 헤더에 직접 추가해서 사용해봤는데도 동일한 에러메시지가 발생합니다.. 등록된 앱 # third party 'debug_toolbar', 'django_pydenticon', 'allauth', 'allauth.account', 'allauth.socialaccount', 'allauth.socialaccount.providers.github', 'rest_framework', 'rest_framework.authtoken', 'corsheaders', DRF 설정 'DEFAULT_PERMISSION_CLASSES' : [ 'rest_framework.permissions.IsAuthenticated', ], 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 'rest_framework.authentication.SessionAuthentication', ], JWT 설정 JWT_AUTH = { 'JWT_SECRET_KEY': SECRET_KEY, 'JWT_ALLOW_REFRESH' : True, 'JWT_ALGORITHM': 'HS256', 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7), 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=28), } CORS_ALLOWED_ORIGINS = [ "http://localhost:3000", ]
- 해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
runserver 에러 질문 있습니다.
-어제 저번 강의에서 python manage.py runserver 이후 localhost 그리고 /admin 까지 정상 접속되는 것 확인 -오늘 강의를 진행하다가 같은 명령어를 쳤으나 ModulNotFoundError가 뜹니다.(localhost 접속 불가능) 개인적으로 지운 파일은 없는데 어디를 더 보는 것이 좋을까요? 프로젝트 초기라 다시 까는 것도 방법인데 그래도 오류를 고쳐보는 것이 좋을 것 같아서 질문 남겼습니다. 시도한 것 -activate해서 (base)가상 환경을 켜주고 실행-> 실패 - 환경 변수 편집에 anaconda3와 관련된 path도 확인 했습니다. 감사합니다.
- 해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
마리아db 문의
안녕하세요 강사님 장고 데이터베이서 중에서 mariadb는 혹시 지원을 못하는걸까요? 사용가능한 리스트에 없어서 문의드립니다!
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
안녕하세요 강사님 이미지 파일, 문서 파일(pdf, docs) 업로드 하는데 아래와 같은 에러메시지가 나옵니다.
안녕하세요 강사님 강의 잘 복습하고 있습니다. 복습중에 antd를 사용하지는 않고 한번 파일을 업로드 해보려 시도중인데 파일(이미지, 문서) 업로드시 아래와 같은 에러가 발생하여 문의드립니다.. ㅜㅜ 위 파일을 제외하고는 장고에 포스트가 잘 작성되는데.. 해당 파일을 포함하면 위와 같은 에러메시지가 발생합니다. const onChangeTitle = (e) => { setTitle(e.target.value) } console.log(title) const onChangeCategory = (e) => { setCategory(e.target.value) } console.log(category) const onChangeContent = (e) => { setContent(e.target.value) } console.log(content) const handleFileCapture = async (e) => { await Setuploadfile({[e.target.name]: e.target.files[0]}) }; console.log({attachedfile}) const handleImageCapture =async (e) => { await SetuploadImage({[e.target.name]: e.target.files[0]}) }; console.log({coverimg}) const handleChange = (e) => { setChecked(e.target.checked); }; console.log('is_public : ', {checked}) const onSubmit = (e) => { e.preventDefault() const formData = new FormData(); formData.append("title", title); formData.append("category", category); formData.append("content", content); formData.append("attached_file", attachedfile); formData.append("cover_img", coverimg); formData.append("is_public", checked) console.log('formData :', formData) const headers = { Authorization: `JWT ${jwtToken}`, "Content-Type": "multipart/form-data", }; Axios.post("http://127.0.0.1:8000/api/posts/", formData, {headers}) .then(response => { history.push('/') console.log(response['status']) }) .catch(error => { console.log(error.response) }) }; 위 console.log로 찍어보면 내용이나 파일 값(상태값)은 잘 반영되는거 같은데.. submit만 하면 에러가 발생합니다.ㅜㅜ 위는 리액트단 코드이고 아래는 장고입니다. - models.py class Post(BaseModel): author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='post_author') category = models.CharField(max_length=100, default='all') title = models.CharField(max_length=100, default='') content = models.TextField(default='') attached_file = models.FileField(blank=True, upload_to="shareinfo/post/cover/%Y/%m/%d", verbose_name='Attached File') cover_img = models.ImageField(blank=True, upload_to="shareinfo/post/cover/%Y/%m/%d", verbose_name='Cover Image') post_tag_set = models.ManyToManyField('Tag', blank=True) like_user_set = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='post_likes') ip = models.GenericIPAddressField(null=True, editable=False) is_public = models.BooleanField(default=True) - serializer.py class PostSerializer(ModelSerializer): author = AuthorSerializer(read_only=True) is_like = serializers.SerializerMethodField("post_likes_field", read_only=True) post_tag_set = serializers.CharField(source='extract_tag_list', read_only=True) class Meta: model = Post fields = ['author', 'is_like', 'post_tag_set', 'title', 'category', 'content', 'attached_file', 'cover_img', 'is_public'] def post_likes_field(self, post): -views.py class PostViewSet(ModelViewSet): queryset = Post.objects.all().filter(is_public=True) parser_classes = [MultiPartParser, FormParser] serializer_class = PostSerializer def get_queryset(self): qs = super().get_queryset() qs = qs.filter( Q(author=self.request.user) | Q(author__in=self.request.user.following_set.all()) ) return qs def perform_create(self, serializer): serializer.save(author = self.request.user, ip=self.request.META['REMOTE_ADDR']) return super().perform_create(serializer) 파일이 어떠한 형식으로 변환되어야지 장고에 저장이 되는거같은데... 어렵습니다..
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
혹시 다음 강의도 계획되어 있으실까요?
오늘도 강의 잘 들었습니다. 개발을 하는 과정에서 주로 replit 을 사용했었는데, rgrok 를 사용하면 번거로움 없이 바로 포트포워딩을 통해 가상 배포? 를 진행할 수 있었군요. :) 혹시 다음 강의도 계획이 있으신지 여쭙고 싶습니다. 감사합니다.
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
안녕하세요 강사님!~
- 여러분의 질문을 고대하고 있습니다. :-)- 질문 전에 검색을 먼저 해보세요. 사람 사는 게 다 비슷하다는 것을 알게 됩니다.- 예의는 거침없이 질문하기 위한 최고의 발명품입니다.- 100개의 설명이 스크린샷 한방 보다 못할 수 있습니다.- 코드를 첨부하면 전세계 누구나 이해할 수 있는 질문이 됩니다.- 하나의 질문에는 하나의 주제를 담아야 답변도 예리해집니다.- 시행착오를 알려주시면 곧 바로 원하는 문제에 집중할 수 있습니다.- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 강사님 axios 처리 과정 구현 중 안돼는 부분이 있어 질의 드립니다. 현재 response를 받아서 응답코드가 201일 경우 success Alert 컴포넌트를 띄우고 싶은데... 백엔드 쪽에 계정만 생성되고 프론트쪽에는 아무런 변화가 없습니다. 혹시 어떤 방향으로 처리해야 할지 문의드립니다. const onSubmit = (e) => { e.preventDefault() setErrors({}); Axios.post("http://localhost:8000/accounts/signup/", inputs) .then(response => { if(response['status'] === 201) { return ( <Alert severity="success">Success</Alert> ) } history.push('/') console.log(response['status']) }, ) .catch(error => { if (error.response) { setErrors({ username: (error.response.data.username || []).join(" "), password: (error.response.data.password || []).join(" "), email: (error.response.data.email || []).join(" ") }); console.log(error.response) } }) .finally(() => { setLoading(true) setInputs({username: '', password: '', email: ''}) }); };
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
안녕하세요 강사님 강의 수강완료 후 복습 중 페이지 구성에 질문이 있어 글남깁니다.!
안녕하세요 강사님. 복습 중에 질문이 있어 문의드립니다. 현재 복습을 목적으로 개인 페이지를 만들어보고 있는데.. 회원가입 버튼을 위 사진과 같이 구성을 하였고, 회원가입의 url은 localhost:3000/accounts/signup 으로 지정한 상태입니다. 제가 질의드리고 싶은것 Create Account 아이콘에 회원가입 url으로 링크를 걸어 버튼이 클릭되면 회원 가입 Form을 호출하는 방식도 가능한지 문의드립니다. 추가로 태그를 포스트 하단에 아래와 같이 자동으로 입력되게 하기 위해.. 아래 코드만들었고 작동을 잘 하지만.. 좀더 간단한 방법도 있는지... 같이 문의드립니다. - 작업 결과 장고 / Post, Tag 모델, content에서 #으로 시작하는 문자열 추출후 Tag 생성/저장 # models.py class Post(BaseModel): author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='post_author') category = models.CharField(max_length=100, default='all') title = models.CharField(max_length=100) content = models.TextField() attached_file = models.FileField(blank=True, upload_to="shareinfo/post/cover/%Y/%m/%d") cover_img = models.ImageField(blank=True, upload_to="shareinfo/post/cover/%Y/%m/%d") post_tag_set = models.ManyToManyField('Tag', blank=True) like_user_set = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='post_likes') ip = models.GenericIPAddressField(null=True, editable=False) class Meta: ordering = ['-id'] def __str__(self): return self.title + ' | ' + str(self.author) def cover_img_url(self): if self.cover_img: return self.cover_img.url else: return self.title def get_absolute_url(self): return reverse('shareinfo:post_detail', args=[self.pk]) def extract_tag_list(self): tag_name_list = re.findall(r"#([a-zA-Z\dㄱ-힣]+)", self.content) tag_list = [] for tag_name in tag_name_list: tag, _ = Tag.objects.get_or_create(name=tag_name) # tag 반환값, 반환결과에 대한 불리언 값 tag_list.append(tag) return tag_list def is_like_user(self, user): return self.like_user_set.filter(pk=user.pk).exists() class Tag(models.Model): name = models.CharField(max_length=20, unique=True) def __str__(self): return self.name #serializer class PostSerializer(ModelSerializer): author = AuthorSerializer(read_only=True) is_like = serializers.SerializerMethodField("post_likes_field") post_tag_set = serializers.CharField(source='extract_tag_list') class Meta: model = Post fields = '__all__' React / post_tag_set을 받아서 문자열을 배열 형태로 변경 후 map함수를 활용하여 태그 컴포넌트 생성 import * as React from 'react'; import Chip from '@mui/material/Chip'; export default function ChipsArray({post}) { const handleClick = () => { console.info('You clicked the Tag.'); }; // 문자열로 받은 post_tag_set을 replace와 map을 활용하여 태그 추출 -> 새로운 배열 생성 const tag_set = post.post_tag_set const string_to_array = tag_set.replace(/ /g, '').replace(/\[/, '').replace(/\]/, '').split(',') const tag_set_array = string_to_array.map(tag => tag.slice(5, -1)) // 생성 후 map을 이용한 태그 컴포넌트 생성 return ( tag_set_array.map((data) => { return ( <Chip label={data} onClick={handleClick} key={data} sx={{fontSize: '15px', marginRight: 1, marginTop: 1}}/> ); }) ); }
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
오늘도 좋은 강의 감사합니다.
안녕하세요! 오늘도 좋은 강의 감사합니다.
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
uuid 및 메모리 설정
안녕하세요! 강의 너무 잘 듣고 있습니다. 에러 문제는 아니고, 강의 뒷부분에 uuid, 파일 메모리에 따른 설정 과정이 이후 강의에서 다뤄질까요?? 이론으로만 알고 넘어가기에는 중요한 내용 같아 여쭤봅니다 :) 만약 없다면 admin.py 파일에서 구축하면 될까요? 감사합니다!
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
파이참 설치 문의
안녕하세요 강사님 혹시 vscode대신 파이참으로 강의 진행해도 되는지 궁금해서 문의 드립니다. 유로버전을 사용하고 있고 혹시 파이참을 사용했을때 강사님 강의 부분을 팔로우 하지 못하는 일이 생길지 문의 드립니다. 감사합니다.
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
detail에 대한 POST 요청
강사님 오늘도 안녕하세요! 강의를 보던중 detail에 대한 POST요청에 대하여 질문이 있어 글을 남깁니다. 강의에서는 좋아요 API를 POST로 설계 하셨는데, Restfull 에서는 detail에대한 POST요청은 부적합한 것인게 아닌가 하는 생각이 들어 질문 남깁니다. 제 생각에는 POST보다는 PATCH 요청이 더 적합하지 않을까 하는 생각이 듭니다.
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
외래키 설정을 다르게 하는 경우
방식 1. class NoticeBoard(models.Model): title = models.CharField(verbose_name='제목') files = models.ForeignKey(Files, on_delete=models.CASCADE) class Files(models.Model): file = models.FileField(upload_to='files/%Y/%m/%d') 방식 2. class NoticeBoard(models.Model): title = models.CharField(verbose_name='제목') class Files(models.Model): post = models.ForeignKey(Files, on_delete=models.CASCADE) file = models.FileField(upload_to='files/%Y/%m/%d') 저는 오히려 방식1처럼 주체가 되는 곳에 외래키 설정을 해줘야 나중에 보기도 쉬운거같은데 방식2를 추천하는 이유가 있을까요?
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
댓글 작성시 500 Internal Server Error 발생합니다
안녕하십니까 유익한 수업 잘 듣고 있습니다. 제이쿼리 코드나 나머지 html, python 코드들도 고민 끝에 모두 깃허브에 있는 코드와 동일하게 작성하였는데, 댓글 작성시 페이지가 작성된 댓글이 포함된 페이지로 전환되지 않고, 그래도 멈춰 있습니다. 업로드된 댓글을 확인하려면 새로고침을 해야 확인 할 수 있습니다. console에는 POSThttp://127.0.0.1:8000/jstagram/post/9/comment/new 500 (Internal Server Error) 라며 에러가 발생하고 있는데 해결 방안 부탁드립니다.. 추가로 cmd창에는 if request.is_ajax(): AttributeError: 'WSGIRequest' object has no attribute 'is_ajax' 이라는 오류가 뜹니다 버튼을 누른 후에도 전환되지 않은 화면입니다 console 화면
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
로그인 관련 질문
1. 현재 장고의 LoginView를 이용하여 로그인 처리를 하고 있습니다. 그러다 보니, 저의 의도: 위와 같이 '서울시청'에 속한 아이디만 로그인 실제: 다른 시청에 속해도 로그인 되고 있습니다. 따라서 저는 LoginView에서 사용하는 AuthenticationForm을 상속 받아 사용하려 합니다. # forms.py from django.contrib.auth.forms import AuthenticationForm class CustomAuthenticationForm(AuthenticationForm): error_messages = { "invalid_login": ( "아이디나 비밀번호가 올바르지 않습니다. 다시 확인해 주세요." ), "inactive": ("이 계정은 인증되지 않았습니다. 인증을 먼저 진행해 주세요."), } def __init__(self, request=None, *args, **kwargs): super(CustomAuthenticationForm, self).__init__(*args, **kwargs) self.fields['username'].label = '아이디' self.fields['password'].label = '비밀번호' def clean(self): username = self.cleaned_data.get("username") password = self.cleaned_data.get("password") from test1.models import UserInfo if UserInfo.objects.filter(agency_name=): # 이 부분 이때, 위에서 받은 '서울시청'을 가져와서 위 코드의 마지막 부분에 넣으려 합니다. 위 form에서 저기 있는 서울시청을 어떻게 가져올 수 있나요?
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
get method로 data 넘기는데 받지를 못합니다.
1. login 페이지에서 '서울' 입력시 2. agency_check page로 넘어가서 '서울'이 포함된 기관 목록을 나타냅니다. 위 목록을 클릭시, 다시 처음 login 페이지로 넘어가서 기관명 입력하는 곳에 '서울시청'이 자동으로 입력되도록 코드를 짯습니다. 3. 실제로는 위 input text value에서 아무 값도 나오지를 않습니다. 위 링크처럼 /login/?agency_name=서울시청이라 get 메소드로 보낸것은 확인이 되는데 안받아져서 무엇이 문제인지 질문 드립니다. # views.py def login(request): agency_name = request.GET.get('agency_name') userInfo = UserInfo.objects.all() context = {'userInfo': userInfo, 'agency_name': agency_name, 'test1': 'test1'} return render(request, 'test1/login.html', context) def agency_check(request): temp = request.POST.get('agency_keyword') # html에서 name = 'agency_keyword' 으로 보낸 값 받음 agencyList = AgencyList.objects.filter(agency_name__contains=temp).order_by('agency_name') context = {'agencyList': agencyList, 'agencyKeyword': temp} return render(request, 'test1/agency_check.html', context) <!-- login.html --> <form action="{% url 'test1:agency_check' %}" method="post" name="form1"> {% csrf_token %} <div class="mt-5 mb-3"> <div> <div class="mt-3"> <p class="fw-bold">기관명</p> </div> {{ agency_name }} {{ test1.text }} <input type="text" class="form-control w-75 d-inline-block bg-light" name="agency_keyword" id="agency_keyword" value="{{ agency_name }}"> <input type="submit" class="btn btn-light btn-outline-dark ms-2" value="조회"> </div> </div> </form>
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
외래키 속성 사용질문
위 코드 처럼 Test2에서 Test1을 외래키 참조 하였습니다. 이때 Test2에서 a변수를 Test1 a 변수와 동일하게 사용하고 싶은데, 어떻게 Test1의 a 변수 값을 할당 할 수 있나요?
- 해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
환경변수를 통한 API HOST 지정 후 생기는 에러 관련 질문드립니다.
강사님 안녕하세요.. 좋은 강의를 제공해주심에 감사드립니다. 다름이 아니라, 섹션 11의 환경변수를 통한 API HOST 지정 강의를 따라하며 기존 localhost:8000 의 주소들을 .env 파일을 만들어 REACT_APP_API_HOST="http://localhost:8000" 를 설정해주고 api.js , Constants.js 로 빼내어서 지정하고 개발 서버를 다시 실행했는데요.. 그 뒤로 이렇게 웹 화면이 뜨지 않는 상황이 발생했습니다. (네트워크 탭에서 api 들이 200 상태로 뜨는데 크기가 0B로 나타나는 것을 보게 되었습니다.) 어떤 점이 오류일 지 ... 고쳐야 하는 부분의 감이 잘 안잡히는 것 같습니다. 답변주시면 대단히 감사하겠습니다...!
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
'accounts' conflicts with the name of an existing Python modu
accounts app을 만드셨는데 혹시 충돌없이 만드는 방법이 있는건가요?
- 미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
'super' object has no attribute 'form_vaild'
18분쯤에 구현하는거 그대로 따라해봤는데 super 가 안되서 글남깁니다 ㅜㅜ