djangoのFormで直接PKを渡してよいのか??

投稿者: Anonymous

現在、ブログ投稿アプリケーションの実装をしているところでして、
テンプレートにカスタムユーザのPKを直接渡してDBに登録させる仕様になっています。

◆Viewより抜粋

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['user_pk'] = self.request.user.pk
    return context

◆テンプレートより抜粋

<div class="form-group col-md-11">
    <label for="id_author">著者</label>
    <input type="hidden" name="{{ form.author.name }}" id="{{ form.author.id_for_label }}" value="{{ user_pk }}" >
</div>

そこで、hiddenでフォームは表示させておりませんが、devtoolsでは当然のことながら参照ができてしまいます。
ですので、もし他ユーザのPKを取得された場合、投稿ユーザの改ざんが可能になってしまいます。

セキュアな部分ですので、可能ならソース側のみで完結させたいのですが、その場合どう実装したらよいでしょうか?

解決

自己解決しました。

フォーム定義

class BlogForm(forms.ModelForm):
    class Meta:
        model = Blog
        # 'author'はここで処理しない
        fields = ('title', 'text', 'category')

ビュー内定義

class ScriptCreateView(generic.CreateView):
    model = Blog
    form_class = BlogForm
    template_name = 'creator/blog_create_form.html'
    success_url = reverse_lazy('Blog:home')

    def form_valid(self, form):
        # データベースに保存する前のモデルオブジェクトを変数に格納
        blog = form.save(commit=False)
        # ※ここでログインユーザ情報を渡す
        blog.author = self.request.user
        blog.save()
        # スーパーメソッドを呼び出しバリデーション(form.is_valid)を行う
        return super().form_valid(form)

以上の処理で、投稿フォームにユーザ(PK)情報を含めずにDB登録できるようになりました。

ご回答していただいた方、ありがとうございます。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *