2017-04-13 21 views
0

我想显示邀请表单。我创建了一个表单,但是当我去到url/invitations/request时,显示的无效块不是带有表单的模板。可能是什么原因?呈现无效的表单块

enter image description here

url(r'^request/$', requestInvitation, name='request-invitation'), 

@csrf_exempt 
def requestInvitation(request): 
    form = InviteForm(request.POST or None) 
    response_data = {} 
    if form.is_valid(): 
     join = form.save(commit=False) 
     email = form.cleaned_data.get('email') 
     already_join, created = Invitation.objects.get_or_create(email=email) 
     if created: 
      already_join.invite_code = get_invite_code() 
      already_join.save() 
      response_data['result'] = "Thank you for your interest" 
      response_data['email'] = email 
      print ('response_data', response_data) 
     return HttpResponse(json.dumps(response_data),content_type="application/json") 
    else: 
     return HttpResponse(json.dumps({'result': 'Error message'})) 
     # return HttpResponseRedirect('/') 
    context = {"form": form} 
    return render(request, 'invitation/invitation.html', context) 

<form method="POST" class="invitation-form vcenter" action="."> 
       {% csrf_token %} 
       <div class="ui action input"> 
       <input type="email" class="requested_email" name="email" placeholder="Email address"> 
       <button class="ui button primary">Request Invite</button> 
       </div> 
</form> 

回答

0

我想,你需要分离出POST调用。我的意思是,你需要检查请求方法是否是POST。事情是这样的:

if request.method == 'POST': # If the form has been submitted... 
    response_data = {} 
    if form.is_valid(): 
     join = form.save(commit=False) 
     email = form.cleaned_data.get('email') 
     already_join, created = Invitation.objects.get_or_create(email=email) 
     if created: 
     already_join.invite_code = get_invite_code() 
     already_join.save() 
     response_data['result'] = "Thank you for your interest" 
     response_data['email'] = email 
     print ('response_data', response_data) 
     return HttpResponse(json.dumps(response_data),content_type="application/json") 
    else: 
     return HttpResponse(json.dumps({'result': 'Error message'})) 
    # return HttpResponseRedirect('/') 

else: 
    # An unbound form 
0

这里是为您的request工作流程:

  1. 一个GET请求时(你只是访问/invitations/request所以request.POST是一个空{}

  2. form = InviteForm(request.POST or None)因此,InviteForm无效

  3. if form.is_valid():False

  4. else: return HttpResponse(json.dumps({'result': 'Error message'}))。因此,将执行else子句,该子句返回您在模板中显示的JSON响应。现在

,该解决方案:

@csrf_exempt 
def requestInvitation(request): 
    form = InviteForm() 
    response_data = {} 
    if request.method == 'POST': 
     # This is a POST request, so request.POST will not be {} 
     form = InviteForm(request.POST) 
     if form.is_valid(): 
      join = form.save(commit=False) 
      email = form.cleaned_data.get('email') 
      already_join, created = Invitation.objects.get_or_create(email=email) 
      if created: 
       already_join.invite_code = get_invite_code() 
       already_join.save() 
       response_data['result'] = "Thank you for your interest" 
       response_data['email'] = email 
       print ('response_data', response_data) 
       return HttpResponse(json.dumps(response_data),content_type="application/json") 
     else: 
      return HttpResponse(json.dumps({'result': 'Error message'})) 

    context = {'form': form} 
    return render(request, 'invitation/invitation.html', context)