utamaro’s blog

誰かの役に立つ情報を発信するブログ

61.DjangoBasicAppsのCommentsを読んでみる

urls.pyには目新しいものがなかったのでスルーします。

urlを使ってbooksと同じように作成されていたのでスルーします。

1つだけわかったことは、viewの引数にはviews.py内のメソッドを入れるということ。

views.pyを確認する

コメント時の日付をバリデーションする方法を見つけました。

get_object_or_404というショートカットが用意されていることにも気が付きました。

このショートカットは便利そうですね。request.userは認証していない場合にNoneになるはずですから、404になる。

djangorestframeworkを使う場合は、serializerを使ったり、IsAuthenticatedを使うことで対応ができると思います。

認証に関しても

DELTA = datetime.datetime.now() - datetime.timedelta(
    minutes=getattr(settings, 'COMMENT_ALTERATION_TIME_LIMIT', 15)
)


def comment_edit(request, object_id, template_name='comments/edit.html'):
    comment = get_object_or_404(Comment, pk=object_id, user=request.user)

    if DELTA > comment.submit_date:
         return comment_error(request)

フォームを使ったバリデーションです。

if request.method == 'POST':
    form = CommentForm(request.POST, instance=comment)
    if form.is_valid():
        form.save()
        return redirect(request, comment.content_object)

CommentFormは↓のようになっています

class CommentForm(ModelForm):
    class Meta:
        model = Comment
        exclude = ('content_type', 'object_pk', 'site', 'user', 'is_public',
            'user_name', 'user_email', 'user_url', 'submit_date', 'ip_address',
            'is_removed',)

個人的には、formは最終的に見た目をカスタマイズすることになるので、Formからタグは作成しないようにしています。

バリデーション目的のみ使うのが良いと思います。

バリデーションのみ行う場合、↓cerberusというライブラリがあるので参考にしてみてください。

http://docs.python-cerberus.org/en/stable/

load i18nという翻訳tag

template内に↓のような記述がありました。

{% load i18n %}

このタグを使うと、翻訳タグを使うことができます。

{% trans "Text" %}

実際に使う際は↓のドキュメントを参考にするとよい

https://docs.djangoproject.com/ja/2.1/topics/i18n/translation/#how-django-discovers-language-preference