我正在使用Django框架编写一个twitter克隆。主页有一个表单和一个POST按钮。点击POST后,我想检查用户是否已登录。如果没有登录,则用户需要登录表单。登录完成后,邮件将保存到数据库并更新主页。我不知道该怎么做。我的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会话,但它变得复杂,我应该在get请求期间保存表单。我该如何解决这个问题?
表格本身如下
<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的post函数
#@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)
请注意装饰器已注释掉。
在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
.
这个解决方案看起来很糟糕,但它现在正在运作。