django

현재 user를 필드 값으로 넣고 싶을 때

발전생 2020. 12. 28. 11:29
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()도 필요하다.