class Post(models.Model):
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
created_date = models.DateTimeField(auto_now=True)
likes = models.PositiveIntegerField(default=0)
class Meta:
ordering = ['-created_date']
이와 같이 Post 모델을 만들었다.
post 작성 form에서 author 필드는 보여져서는 안 된다. 보여진다면 자신이 아닌 다른 user의 이름으로 게시물을 작성할 수 있게 된다.
1. 처음에는 요행으로 문제를 해결하려 했다. author 필드를 form field에 포함시키되 브라우저에 보이지 않게 css로 처리해주려고 했다. 그러나 이것은 문제를 확실히 해결하지는 못 했다. 개발자 콘솔을 통해 visibility를 바꿔주면 author 필드를 마음대로 바꿀 수 있게 된다. 다른 해결책이 필요하다.
2. 역시나 공식 문서에서 답을 찾을 수 있었다.
def home(request):
if request.method == 'POST':
form = PostForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.author = request.user
post.save()
#use axios
return redirect('home')
else:
form = PostForm()
return render(request, 'my_book/home.html', {'form': form})
author 필드는 form에서 생략해준다. author field에 null이 허용되지 않은 상태에서 form.save()를 하게 되면 오류가 발생한다.
하지만 form.save(commit=False) 를 사용하면 문제를 해결할 수 있다.
이 코드는 form을 바탕으로 해당 모델의 인스턴스를 만들어 리턴하고 인스턴스를 데이터베이스에 저장하지는 않는다.
그렇기 때문에 특정 field 값을 view에서 지정해줄 수 있다. 그런 다음 인스턴스를 save() 하면 된다.
단. 모델에 ManyToMany 관계가 있을 경우 save_m2m()도 필요하다.
'django' 카테고리의 다른 글
django serializer로 foreign key 관계의 원하는 값들을 가져오는 방법 (0) | 2020.12.29 |
---|---|
순수 django + vue template을 사용하여 비동기로 게시물 불러오기, 좋아요 처리 (0) | 2020.12.28 |
django에 react나 vue를 결합시켜야 하는가? (0) | 2020.12.25 |
현재 html에서 필요한 css 파일만 불러오기 (0) | 2020.12.23 |
회원가입, 로그인, 로그아웃 (0) | 2020.12.20 |