Python 如何在Django中使用get_context_data()?
我想在一篇博文中回复尸体的照片。但我发现用get_context_数据很难做到这一点 这是创建帖子的查看功能:Python 如何在Django中使用get_context_data()?,python,django,django-views,Python,Django,Django Views,我想在一篇博文中回复尸体的照片。但我发现用get_context_数据很难做到这一点 这是创建帖子的查看功能: class BlogCreateView(LoginRequiredMixin, CreateView): model = Post template_name = 'blog/creator/new_post.html' fields = ['title', 'category', 'slug', 'body'] login_url = 'login'
class BlogCreateView(LoginRequiredMixin, CreateView):
model = Post
template_name = 'blog/creator/new_post.html'
fields = ['title', 'category', 'slug', 'body']
login_url = 'login'
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
现在,我想做的是返回'body'的readtime
大概是这样的:
body = request.POST.get('body')
post_read_time = readtime.of_html(body)
post = Post(read_time=post_read_time)
post.save()
问题是如何在我的BlogCreateView类中做到这一点
我做了一些研究,发现了get_context_data函数。所以我试了一下:
class BlogCreateView(LoginRequiredMixin, CreateView):
model = Post
template_name = 'blog/creator/new_post.html'
fields = ['title', 'category', 'slug', 'body']
login_url = 'login'
post_read_time = ''
def get_context_data(self, **kwargs):
context_data = super().get_context_data(**kwargs)
context_data['body'] = readtime.of_html('body')
c = Post.objects.filter(read_time=context_data)
return context_data
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
以下是我在模板中呈现数据的方式:
<span>{{ post.read_time }}</span>
我希望输出返回读取时间,但我只会让事情变得更糟。我得到了这个错误:
TypeError at /blog/post/new-post66/
{'object': <Post: We Should All Be Farmers>, 'post': <Post: We Should All Be Farmers>, 'view': <blog.views.PostDetailView object at 0x042D5590>, 'body': <QuerySet [<Post: We Should All Be Farmers>, <Post: We Should All Be Farmers>]>}
Request Method: GET
Request URL: http://127.0.0.1:8000/blog/post/new-post66/
Django Version: 2.0
Exception Type: TypeError
Exception Value:
{'object': <Post: We Should All Be Farmers>, 'post': <Post: We Should All Be Farmers>, 'view': <blog.views.PostDetailView object at 0x042D5590>, 'body': <QuerySet [<Post: We Should All Be Farmers>, <Post: We Should All Be Farmers>]>}
Exception Location: C:\Users\user\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\pyquery\pyquery.py in __init__, line 266
Python Executable: C:\Users\user\AppData\Local\Programs\Python\Python36-32\python.exe
Python Version: 3.6.0
Python Path:
['C:\\Projects\\project\\django-personal-website',
'C:\\Projects\\project\\django-personal-website',
'C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python36-32\\Lib\\site-packages',
'C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python36-32\\python36.zip',
'C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python36-32\\DLLs',
'C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python36-32\\lib',
'C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python36-32',
'C:\\Users\\user\\AppData\\Roaming\\Python\\Python36\\site-packages',
'C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\site-packages\\win32',
'C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\site-packages\\win32\\lib',
'C:\\Users\\user\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\site-packages\\Pythonwin']
Server time: Wed, 8 May 2019 17:24:18 +0000
我不明白你为什么认为这应该在get_context_数据中完成。您似乎希望在作为表单提交的一部分创建的Post对象上设置读取时间。因此,您应该在form_valid中这样做,就像设置用户一样
def form_valid(self, form):
form.instance.author = self.request.user
form.instance.read_time = readtime.of_html(form.cleaned_data['body'])
return super().form_valid(form)
您应该在上下文中设置post键,因为您的流程错误:当您的用户创建新的博客文章时,您的CreateView将在数据库中创建新对象,然后将用户重定向到另一个视图(通常是刚刚创建的文章的DetailView)或包含所有文章的ListView。这是一个不同的视图,所以您不应该在CreateView中返回实时,您应该保存它@DanielRoseman在回答中向您展示了如何做到这一点。那么您的列表视图或详细视图应该注意在模板中显示它。@dirkgroten感谢您的澄清。我现在明白整件事是怎么回事了。