#概要
Djangoでアプリ作成のときに、render
とreverse_lazy
の違いがわからなかったので、備忘録として書きます。
#TemplateView or Function
結論からいうと、reverse_lazy
はTemplateView
で使い、render
はfunction
で実装する場合に使用します。
下記にて、投稿サイトをイメージした例になります。
-
PostClass
とlistfunction
に注目してください
myapp/models.py
from django.db import models
class PostModel(models.Model):
title = models.CharField(max_length=50)
memo = models.TextField()
myapp/views.py
from django.views.generic import CreateView
from django.urls import reverse_lazy
from .models import PostModel
class PostClass(CreateView):
template_name = 'post.html'
model = PostModel
fields = ('title','memo')
success_url = reverse_lazy('list')
def listfunction(request):
object_list = PostModel.objects.all()
return render(request, 'list.html')
myapp/urls.py
from django.urls import path
from .views import PostClass, listfunction
urlpatterns = [
path('post/', PostClass.as_view(), name='post'),
path('list/', listfunction, name='list'),
]
post.html
<form action="" method="POST">
{% csrf_token %}
<p>タイトル:<input type="text" name="title"></p>
<p>メモ:<input type="text" name="memo"></p>
<input type="submit" value="投稿する">
</form>
list.html
<div class="container">
{% for post in object_list %}
<div class="post">
<p>タイトル:{{ post.title }}</p>
<p>メモ:{{ post.memo }}</p>
</div>
{% endfor %}
</div>
#まとめ
上記でも書いたように
-
reverse_lazy
はTemplateView
の場合 -
render
はfunction
の場合になります
参照:
https://docs.djangoproject.com/ja/2.2/ref/urlresolvers/
https://teratail.com/questions/103080
https://teratail.com/questions/50683
以上