2016-12-09 4 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

И это не создает нового пользователя. Любая идея, в чем проблема?

EDIT: Пробовал 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 (имя пользователя = имя пользователя, пароль = пароль) 'возьмите внутрь if. Бу, это не проблема, я думаю. Вы уверены, что ваш URL-адрес в порядке? – metmirr

+0

Только фиксированный отступ. Ну, это моя домашняя страница, поэтому нет отдельного URL-адреса для регистрации. Таким образом, регистрация осуществляется через javascript (onclick) с главной страницы. Любая идея, если это влияет на нее? – Zorgan

ответ

0

Ok я вижу вопрос исправить отступы, ваш, если заявление должно быть внутри функции 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-based-views/intro/# handling-forms-with-class-views- – Dilmer

+0

Вам также не хватает действия = ""? вам нужно указать URL-адрес, в который вы хотите отправить сообщение. Взгляните на свой urls.py, и URL, который вы добавили для своего вида, должен быть тем, который использовался в действии. – Dilmer

0

Вам нужно добавить post() метод и FormMixin к вашему ОЦК, как это:

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()' return False, поэтому да, данные могут быть недействительными, но я не уверен, почему. Я опубликовал код в своем редактировании. – Zorgan

Смежные вопросы