2016-12-09 267 views
1

我想在主页上进行注册,所以我没有单独的URL来处理注册。我试图通过get_context_data发送表单,但它不起作用。这里是我的代码:错误:方法不允许(POST):“POST/HTTP/1.1”405 0

forms.py

class UserRegistrationForm(forms.ModelForm): 
    password = forms.CharField(widget=forms.PasswordInput) 

    class Meta: 
     model = User 

     fields = [ 
      'username', 
      'password', 
     ] 

views.py

class BoxesView(ListView): 
    template_name = 'polls.html' 

    def get_context_data(self): 
     context = super(BoxesView, self).get_context_data() 

     # login 
     if self.request.method == 'POST': 
      form = UserRegistrationForm(self.request.POST or None) 
      context['form'] = form 
      if form.is_valid(): 
       username = form.cleaned_data['username'] 
       password = form.cleaned_data['password'] 
       user = User.objects.create_user(username=username, password=password) 
       user.save() 
       return redirect('/') 
      else: 
       print(form.errors) #doesn't print anything 
       print(form.non_field_errors()) #doesn't print anything 
       print('Errors') #doesn't print anything 
     else: 
      form = UserRegistrationForm() 
      context['form'] = form 

    return context 

    def get_queryset(self): 
     pass 

base.html文件

<form action="" enctype="multipart/form-data" method="post">{% csrf_token %} 
    <div class="registerBox"> 
     {{ form.username }} 
     {{ form.password }} 
     <input type="submit" value="register"/> 
    </div> 
</form> 

所以,当我提交表单,它给出了这个错误:Method Not Allowed (POST): "POST/HTTP/1.1" 405 0

而且它不创建一个新的用户。任何想法是什么问题?

编辑:尝试FormMixin,得到这个错误:The view app.views.BoxesView didn't return an HttpResponse object. It returned None instead.

class BoxesView(ListView): 
    template_name = 'polls.html' 
    form_class = UserRegistrationForm 

    def post(self, request, *args, **kwargs): 
     form = self.get_form() 
     if form.is_valid(): 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 
      user = User.objects.create_user(username=username, password=password) 
      user.save() 
      return redirect('/') 

    def get_context_data(self): 
     context = super(BoxesView, self).get_context_data() 
     context['form'] = self.get_form() 


     return context 

    def get_queryset(self): 
     pass 
+0

'用户= User.objects.create_user(用户名=用户名,密码=密码)'如果。这不是我想的问题。你确定你的网址是好的吗? – metmirr

+0

只是固定缩进。那么这是我的主页 - 所以没有单独的URL注册。因此,通过JavaScript(onclick)从主页访问注册。任何想法,如果这是影响它? – Zorgan

回答

0

好吧,我看到了问题解决的压痕,你的if语句应该是没有外get_context_data函数内部;)

+0

只是固定了缩进,但仍然不起作用。相同的错误:方法不允许(POST):“POST/HTTP/1.1”405 0 – Zorgan

+0

而不是使用get_context_data使用post方法,看看这个链接https://docs.djangoproject.com/en/1.10/topics/class-views-intro /#handling-forms-with-class-based-views – Dilmer

+0

你也错过了action =“”?您需要指定要发布到的URL。看看你的urls.py,你为视图添加的URL必须是该操作中使用的URL。 – Dilmer

0

您需要添加post()方法和FormMixin您CBV这样的:

class BoxesView(FormMixin, ListView): 
    template_name = 'polls.html' 
    form_class = UserRegistrationForm 
    # ... 

    def post(self, request, *args, **kwargs): 
     form = self.get_form() 
     if form.is_valid(): 
      # ... 
     else: 
      # ... 
     return render(request, self.template_name, {'data': some_data}) 
+0

我已经试过了,以及。我没有得到任何错误,但它没有创建一个新的用户。 – Zorgan

+0

你确定你的表格数据是有效的?因为'它没有创建一个新的用户'可能是由别的东西引起的! – ettanany

+0

'form.is_valid()'返回False,所以是的数据可能不是有效的,但我不知道为什么。我在我的编辑中发布了代码。 – Zorgan