我在视图中了解了一些关于上下文数据的内容,但您是否作为专业人士使用内置的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
)
)
感谢您的时间和帮助。
答案 0 :(得分:1)
您可以将CBV用于其自身目的。基本上,CBV被分为几个组 - List
,Detail
,Edit
,依此类推。如果您了解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的ListView
,DetailView
和其他观点是针对常见用法的精心准备的视图。如果你不想要,你可以不使用它。只需使用View
许多模型,就可以使用许多功能。 (虽然它并不是那么好的单一观点。)
答案 1 :(得分:0)
通用CBV是为一个模型设计的,但它们的逻辑可以用作更复杂页面的示例。