繁体   English   中英

如何将基于类的视图转换为基于函数的视图? - Django

[英]How can I convert my class-based view to function-based views? - Django

我正在尝试将所有基于类的视图更改为基于函数的视图,并且在转换以下 class 时遇到困难:

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})

function 和表单应该完全符合这个基于类的视图的功能,所以如果有人可以帮助我,请告诉我。

您可以在UpdateView (以及CreateView )中指定.form_class属性 [Django-doc] 所以我们可以创建一个像这样的表单:

# 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 PostForm

class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, SuccessMessageMixin, UpdateView):
    model = Post
    form_class = PostForm
    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 modelform_factory Django-doc]为您制作一个,因此通过使用另一个ModelForm ,我们不会改变使用表单的逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM