试图了解CBV,但是用几种模型组织单个页面的好方法是什么?

时间:2018-06-14 06:53:50

标签: python django

我在视图中了解了一些关于上下文数据的内容,但您是否作为专业人士使用内置的CBV,或者您如何组织一个配置文件应用程序?在配置文件视图中,可以有一个用于发布文本的表单,一个用于显示用户模型中的用户详细信息的标记,以及可能来自配置文件模型的其他一些数据,然后可能是用户朋友和最受欢迎帖子的列表等等上..

我发现很难理解如何为更大的项目构建视图。我们不应该在同一页面中使用ListView,CreateView,DetailView等,它们仅用于小型网站的简单快速使用吗?

这样做的标准方法是什么?你知道任何github项目是一个很好的例子,对初学者来说不是太大了吗?

例如,下面是我如何构建一个登录和注册视图 - 它很可能不是详细信息中的可靠代码,但总体上看结构 - 对于每种类似的情况都是正常的吗?

class MainView(TemplateView):
    template_name = 'main/start.html'

    def get(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            return HttpResponseRedirect('/')
        else:
            login_form = AuthForm(self.request.GET or None)
            register_form = UserCreationForm(self.request.GET or None)
            context = self.get_context_data(**kwargs)
            context['login_form'] = login_form
            context['register_form'] = register_form
            return self.render_to_response(context)


class LoginFormView(FormView):
    form_class = AuthForm
    template_name = 'main/start.html'
    success_url = '/'

    def post(self, request, *args, **kwargs):
        login_form = self.form_class(data=request.POST)
        register_form = UserCreationForm()
        if login_form.is_valid():
            login(request, login_form.get_user())
            return HttpResponseRedirect("/")
        else:
            return self.render_to_response(self.get_context_data(login_form=login_form, ))


class RegisterFormView(FormView):
    form_class = UserCreationForm
    template_name = 'main/start.html'
    success_url = '/'

    def post(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            return HttpResponseRedirect('/')
        else:
            register_form = self.form_class(request.POST)
            login_form = AuthForm()
            if register_form.is_valid():
                register_form.save()
                return self.render_to_response(self.get_context_data(success=True))
            else:
                return self.render_to_response(self.get_context_data(
                        register_form=register_form,
                        login_form=login_form
                    )
                )

感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:1)

您可以将CBV用于其自身目的。基本上,CBV被分为几个组 - ListDetailEdit,依此类推。如果您了解REST,您可以理解django cbv尝试遵循RESTful方式。 (https://en.wikipedia.org/wiki/Representational_state_transfer)。

如果您的目的与任何CBV不匹配,您只需使用Base CBV,View

from django.http import HttpResponse

def my_view(request):
    if request.method == 'GET':
        # <view logic>
        return HttpResponse('result')

这个fbv代码将是......

from django.http import HttpResponse
from django.views import View

class MyView(View):
    def get(self, request):
        # <view logic>
        return HttpResponse('result')
CBV中的

这就是全部。来自django的ListViewDetailView和其他观点是针对常见用法的精心准备的视图。如果你不想要,你可以不使用它。只需使用View许多模型,就可以使用许多功能。 (虽然它并不是那么好的单一观点。)

答案 1 :(得分:0)

通用CBV是为一个模型设计的,但它们的逻辑可以用作更复杂页面的示例。