2016-12-09 2 views
0

Ich versuche, Register auf der Homepage möglich zu machen (Registerbox erscheint onclick), so habe ich keine separate URL für die Registrierung. Ich versuche, das Formular über get_context_data zu senden, es funktioniert jedoch nicht. Hier ist mein Code:form.is_valid ist nicht validieren

forms.py

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

    class Meta: 
     model = User 

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

views.py

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

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

    # login 
    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, password) 
     user.save() 
     return redirect('/') 

    return context 

     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> 

Die Felder zeigen aber nach dem Absenden des Formulars erstellt es keinen Benutzer, weil mein form.is_valid False ist. Irgendeine Idee?

Antwort

0

Es sieht so aus, als ob Ihr Formular confirm_password eingereicht hat, aber das ist nicht Teil Ihres HTML-Formulars.

+0

nur entfernt, dass immer noch nicht funktioniert – Zorgan

+0

Drucken Sie 'form.errors' und' form.non_field_errors' nach dem 'wenn form.is_valid()' Block, und sehen Sie, welche Fehler es druckt –

1

Sie sollten keine Antwort von get_context_data() zurückgeben. Stattdessen tun, dass in der post() Methode wie folgt:

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

    def post(self, request, *args, **kwargs): 
     form = UserRegistrationForm(request.POST) 

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

    def get_context_data(self): 
     context = super(BoxesView, self).get_context_data() 
     context['form'] = UserRegistrationForm() 
     return context 
+0

änderte es, aber immer noch eine Methode nicht erlaubt (POST):/home/ "POST/home/HTTP/1.1" 405 Fehler. Irgendeine Idee? – Zorgan

+0

Ich habe tatsächlich geändert, wie das geht. Ich glaube nicht, dass eine Antwort von 'get_context_data' korrekt ist. Sie sollten das stattdessen von "post" machen. – grantmcconnaughey

+0

Sie erhalten eine Methode nicht erlaubt Fehler, weil die 'ListView' keine' post' Methode hat. Sie müssen also eine wie im Beispiel hinzufügen. Siehe [Classy CBV] (http://ccbv.co.uk/projects/Django/1.10/django.views.generic.list/ListView/) für die verfügbaren Methoden/Attribute auf "ListView". – grantmcconnaughey