Как я могу преобразовать свое представление на основе классов в представление на основе функций? - Django - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь изменить все мои представления, основанные на классе, на представления, основанные на функциях, и мне трудно преобразовать следующий класс:

class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, SuccessMessageMixin, UpdateView):
    model = Post
    fields = ['image', 'title', 'category', status', 'description']
    template_name = 'blog/post-form.html'
    success_message = 'Your post has been updated.'

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        return False

    def get_context_data(self, **kwargs):
        context = super(PostUpdateView, self).get_context_data(**kwargs)
        context['title'] = 'Update post'
        context['submit'] = 'Update'
        return context

    def get_success_url(self):
        author = self.object.author 
        return reverse_lazy( 'profile', kwargs={'author': author.username})

Функция и форма должны делать именно то, что основано на этом классе. View делает, поэтому, если кто-то может помочь мне, пожалуйста, дайте мне знать.

1 Ответ

2 голосов
/ 03 апреля 2020

Вы можете указать атрибут .form_class [Django -doc] в UpdateView (а также в CreateView). Таким образом, мы можем создать форму вроде:

# app/forms.py

from django import forms

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['image', 'title', 'category', 'status', 'description']
        widgets = {
            'image': …
        }

Где вы замените … на виджет, который вы хотите использовать для поля image.

Затем вы можете подключить эту форму :

# app/views.py

from app.forms import <b>PostForm</b>

class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, SuccessMessageMixin, UpdateView):
    model = Post
    <b>form_class = PostForm</b>
    template_name = 'blog/post-form.html'
    success_message = 'Your post has been updated.'

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        return False

    def get_context_data(self, **kwargs):
        context = super(PostUpdateView, self).get_context_data(**kwargs)
        context['title'] = 'Update post'
        context['submit'] = 'Update'
        return context

    def get_success_url(self):
        author = self.object.author 
        return reverse_lazy( 'profile', kwargs={'author': author.username})

За занавесками, если вы не укажете form_class, Django просто сделает для вас один с modelform_factory [Django -doc] , поэтому, используя другой ModelForm, мы не меняем логику c использования формы.

...