Как использовать get_context_data () в Django? - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь вернуть readtime тела в блоге. Но мне трудно сделать это с get_context_data()

Это функция просмотра для создания сообщения:

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)

Теперь я хочу вернуть readtime для 'body'

примерно так:

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

1 Ответ

1 голос
/ 08 мая 2019

Я не понимаю, почему вы думаете, что это должно быть сделано внутри get_context_data. Похоже, вы хотите установить read_time для объекта 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)
...