2017-07-24 108 views
1

我想将function based view转换为的Django。该视图的功能是显示主页以及登录/注销表单/按钮。 enter image description here基于Django的视图登录

基本上,如果用户登录,注销按钮将显示在Account下面,如果用户已经注销,将会显示一个login表单。所以,它适合我的基于功能的看法:

views.py

def _get_login_form(request): 
    form = UserLoginForm(request.POST or None) 
    if request.POST and form.is_valid(): 
     username = form.cleaned_data.get('username') 
     password = form.cleaned_data.get('password') 
     user = authenticate(username=username, password=password) 
     if user: 
      login(request, user) 

    return form 

@csrf_protect 
def index(request): 
    if request.user.is_authenticated(): 
     form = forms.Form(request.POST or None) 
     if 'logout-button' in request.POST and form.is_valid(): 
      logout(request) 
      form = _get_login_form(request) 
    else: 
     form = _get_login_form(request) 

    info = { 
     'company_name' : 'Purpose VC', 
     'form': form, 
     'lorem': '''Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. 
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.''' 
    } 
    return render(request, 'main/index.html', info) 

,但我有与Class based View麻烦。这是我到目前为止有:

class IndexView(TemplateView): 
    template_name = 'main/index.html' 

    def get_context_data(self, **kwargs): 
     context = super(IndexView, self).get_context_data(**kwargs) 
     context['company_name'] = 'Purpose VC' 
     context['lorem'] = '''Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. 
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. 
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.''' 
     context['form'] = kwargs['form'] 
     return context 

    def get(self, request): 
     form = UserLoginForm(request.POST or None) 
     return self.get_context_data(self, form) 

    def post(self, request): 
     if request.user.is_authenticated(): 
      if 'logout-button' in request.POST and form.is_valid(): 
       logout(request) 
       form = self._get_login_form(request) 
     else: 
      form = self._get_login_form(request) 

     return self.get_context_data(self, form) 

    def _get_login_form(self, request): 
     form = UserLoginForm(request.POST or None) 
     if request.POST and form.is_valid(): 
      username = form.cleaned_data.get('username') 
      password = form.cleaned_data.get('password') 
      user = authenticate(username=username, password=password) 
      if user: 
       login(request, user) 

     return form 

我有传递,如果用户进行身份验证或不基于相应表格的麻烦。我得到的具体错误是context['form'] = kwargs['form'] KeyError: 'form' 任何想法?

回答

1

试试这个

context['form'] = self.kwargs.get('form') 
+0

好吧,似乎工作。现在我想我需要实现一个get函数,因为表单没有显示。 – anderish

+0

你能告诉我什么是form = forms.Form(request.POST或None)使用这一行以及它如何工作? –

+0

对不起,这是一个不必要的代码行。我编辑了上面的代码。 – anderish