2016-03-06 121 views
0

我正在用Django框架编写一个twitter克隆。主页有一个表单和一个POST按钮。点击POST后,我想检查用户是否登录。如果没有登录,它将使用户登录窗体。一旦登录完成,邮件将被保存到数据库并更新主页。我不知道如何去做。我的django方法如下Django如何登录后点击按钮?

class MsgListView(ListView): 
    model = coremodels.message 
    template_name = "msg.html" 
    def get_context_data(self, **kwargs): 
     context = super(MsgListView, self).get_context_data(**kwargs) 
     context['form'] = MsgForm() 
     return context 

    #@method_decorator(login_required(login_url=reverse('MsgListView'))) 
    @method_decorator(login_required) 
    def post(self, request, *args, **kwargs):                            
     print "Inside MsgListView post" 
     view = MsgFormPost.as_view() 
     return view(request, *args, **kwargs) 

class MsgFormPost(FormView, SingleObjectMixin): 
    form_class = MsgForm 
    model = coremodels.message; 

    def post(self, request, *args, **kwargs): 
     #if not request.user.is_authenticated(): 
     # return HttpResponseForbidden() 
     self.object = None 
     return super(MsgFormPost, self).post(request, *args, **kwargs) 

    def get_success_url(self): 
     return reverse('MsgListView') 

class MsgForm(forms.ModelForm):                               
    date_n_time = forms.DateTimeField(initial=date.today(), widget=HiddenInput()) 
    parent = forms.ModelChoiceField(queryset=coremodels.message.objects.none(),required=False,widget=forms.HiddenInput()) 
    text = forms.CharField(widget = forms.Textarea(attrs={'cols':1,'rows':3, 'id': 'msginput','oninput':"this.editor.update()"})) 
    def is_valid(self): 
     self.fields["parent"] = forms.ModelChoiceField(queryset=coremodels.message.objects.all(),required=False,widget=forms.HiddenInput()) 
     return super(MsgForm, self).is_valid() 
    class Meta: 
     model = coremodels.message 
     fields = "__all__" 

问题是,登录装饰器完全忽略POST参数。 我试过使用Django会话,但它变得复杂,因此,我应该在获取请求期间保存表单。我该如何解决这个问题?

的形式本身就是如下

<form autocomplete="off" class=" message" name="post-box" action="" enctype="multipart/form-data" method="POST"> 
       <input type="hidden" name="csrfmiddlewaretoken" value="Ij1kmJuP84KdNIedcg3JnryvzaEFXk2q"> 
       <div class="control-group"> 
        <div class="controls"> 

        <div id="post-box-body"> 
         <textarea name="text" id="tagsinput_id" oninput="this.editor.update()" class="input-block-level" rows="2" placeholder="Write message" style="overflow: hidden; word-wrap: break-word; height: 130px;"></textarea> 

        </div> 
        <div id="post-box-footer"> 
         <div class="pull-right"> 
         <button data-pre-flight-text="Post" data-in-flight-text="Posting..." type="submit" class="btn btn-primary limited-access-aware">Post</button> 
         </div> 
        </div> 
        </div> 
       </div> 

       <div class="form-group warning col-md-4 data-picker col-xs-4 col-md-4 col-sm-4" style="/* width: 160px; */"> 
        <!--<label for="exampleInputFile">Date n time</label>--> 
        <input class="form-control" id="id_date_n_time" name="date_n_time" type="hidden" value="2016-03-06"> 

       </div> 
       <div class="form-group warning col-md-4"> 
        <!--<label for="exampleInputFile">Parent</label>--> 
        <input class="form-control" id="id_parent" name="parent" type="hidden"> 

       </div> 

+0

什么是你的主页的视图方法,它的形式是什么? –

+0

主页MsgListView的基于类的视图。我已经复制了上面的代码。 – user763410

+0

为什么使用ListView来显示表单?你需要使用一个简单的视图(如FormView)来显示你的登录表单;然后为您的主页提供单独的视图,其中包含推文。通过将它们结合在一起来混淆你自己。请参阅[文档](https://docs.djangoproject.com/en/1.9/topics/auth/default/#how-to-log-a-user-in)以获取有关如何在 –

回答

0

要加入会话密钥

#@method_decorator(login_required(login_url=reverse('MsgListView'))) 
#@method_decorator(login_required) 
def post(self, request, *args, **kwargs): 
    print "Inside MsgListView post" 

    if not request.user.is_authenticated(): 
     request.session['checkpoint'] = json.dumps(request.POST) 
     request.session['post_after_login'] = True 

     return redirect('user_login') 

    view = MsgFormPost.as_view() 
    return view(request, *args, **kwargs) 

注意装饰被注释掉回答我的问题, 修改MsgListView的职位功能。

在user_login函数(服务登录视图)中,我输入用户名和密码,验证用户,然后调用login()。完成此操作后,我检索会话变量并将信息发布到MsgListView,如下所示。

urls.py:

url(r'^login$', coreviews.user_login, name='user_login') 

view.py:

def user_login(request): 

if request.method == 'POST' and request.POST.get("next") is not None: 
    next_url = request.POST["next"] 
elif request.method == 'GET' and request.GET.get("next") is not None: 
    print "request.GET is ",request.GET 
    print "request.GET.next is ",request.GET.get("next"),"raghu" 
    next_url = request.GET["next"] 
else: 
    next_url = "/" #settings.LOGIN_REDIRECT_URL 

# If the request is a HTTP POST, try to pull out the relevant information. 
if request.method == 'POST': 
    username = request.POST.get('username') 
    password = request.POST.get('password') 
    user = authenticate(username=username, password=password) 
    if user: 
     if user.is_active: 
      login(request, user) 
      if request.session.get("post_after_login") == True: 
       checkpoint = json.loads(request.session['checkpoint']) 
       request.POST = checkpoint                            
       view = MsgFormPost.as_view() 
       request.session.pop('post_after_login') 
       return view(request, None, **checkpoint) 

      return HttpResponseRedirect(next_url,'/msg') 
     else: 
      # An inactive account was used - no logging in! 
      return HttpResponse("Your account is disabled.") 
      . 
      .#Remaining logic 
      . 

该解决方案似乎哈克,但它的工作现在。