2017-02-17 5 views
0

Ich habe versucht, HTML mit Formular, das ich in forms.py gemacht habe, zu rendern, aber dies funktioniert nicht, nur fehlgeschlagen, ohne Fehlermeldung geladen. Außerdem gibt es keine Nachricht in der Konsole, also habe ich Schwierigkeiten, das zu beheben. Bitte schau und sag mir, welcher Teil falsch ist.Django: Formular in forms.py wird nicht in HTML angezeigt

Dies ist urls.py

url(r'^profile/(?P<username>[-\w.]+)/$', views.profile, name='profile'), 
url(r'^password_change/(?P<username>[-\w.]+)/$', views.password_change, name='password_change'), 
url(r'^password_change_done/$', views.password_change_done, name='password_change_done'), 

forms.py

class PasswordChangeForm(forms.Form): 
    oldpassword = forms.CharField(max_length = 20, widget=forms.TextInput(attrs={'type':'password', 'placeholder':'your old Password', 'class' : 'span'})) 
    newpassword1 = forms.CharField(max_length = 20, widget=forms.TextInput(attrs={'type':'password', 'placeholder':'New Password', 'class' : 'span'})) 
    newpassword2 = forms.CharField(max_length = 20, widget=forms.TextInput(attrs={'type':'password', 'placeholder':'Confirm New Password', 'class' : 'span'})) 

    class Meta: 
     model = User 
     fields = ("username",) 
     field_classes = {'username': UsernameField} 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     if self._meta.model.USERNAME_FIELD in self.fields: 
      self.fields[self._meta.model.USERNAME_FIELD].widget.attrs.update({'autofocus': True}) 

    def clean(self): 
     if 'newpassword1' in self.cleaned_data and 'newpassword2' in self.cleaned_data: 
      if self.cleaned_data['newpassword1'] != self.cleaned_data['newpassword2']: 
       raise forms.ValidationError(_("The two password fields did not match.")) 
      return self.cleaned_data 

    def save(self, commit=True): 
     user = super().save(commit=False) 
     user.set_password(self.cleaned_data["password1"]) 
     if commit: 
      user.save() 
     return user 

views.py

@login_required 
def password_change(request, username): 
if request.method == 'POST': 
    form = PasswordChangeForm(data=request.POST, user=request.user) 
    print("username is "+username) 

    if form.is_valid(): 
     #form.save() 
     update_session_auth_hash(request, form.user) 
     form.save() 
     print("A") 
     return HttpResponseRedirect('/blog/password_change_done/') 
    else: 
     update_session_auth_hash(request, form.user) 
     form.save() 
     print("B") 
     return redirect(reverse('blog:profile', args=[form.user.get_username()])) 
else: 
    print("C") 
    form = PasswordChangeForm(user=request.user)#unbound 
    return redirect(reverse('blog:profile', args=[form.user.get_username()])) 

profile.html (wo PASSWORD_CHANGE geladen werden soll.)

<h2>password change</h2> 
{% if error_message %} 
<p><strong>{{ error_message }}</strong></p> 
{% else %} 
{% endif %} 
<form class="form-horizontal" role="form" action="{% url 'blog:password_change' user.username %}" method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <button type="submit" class="button-primary">password change</button></div> 
</form> 
Hier
+0

können Sie den ganzen Rest der Seite sehen? Nur dieses Formular ist nicht geladen? –

+0

@AlexanderTyapkov Rest der Seite ist korrekt geladen, ich denke, es ist, weil andere Teile mit HTML aufgebaut sind. Nur dieses Formular wird nicht geladen. – camila

+0

Sie stellen der Vorlage kein Formular zur Verfügung, haben Sie sie gesehen? –

Antwort

0

ist eines der Beispiele, wie change_password Ansicht implementiert werden kann

from django.contrib import messages 
from django.contrib.auth import update_session_auth_hash 
from django.contrib.auth.forms import PasswordChangeForm 
from django.shortcuts import render, redirect 

def change_password(request): 
    if request.method == 'POST': 
     form = PasswordChangeForm(request.user, request.POST) 
     if form.is_valid(): 
      user = form.save() 
      update_session_auth_hash(request, user) # Important! 
      messages.success(request, 'Your password was successfully updated!') 
      return redirect('accounts:change_password') 
     else: 
      messages.error(request, 'Please correct the error below.') 
    else: 
     form = PasswordChangeForm(request.user) 
    return render(request, 'accounts/change_password.html', { 
     'form': form 
    }) 

Werfen Sie einen Blick auf die Rolle zu bekommen Anfrage bezogen. Dort müssen Sie das Formular erstellen und die Seite mit Kontext rendern. Sie sollten dem Kontext ein Formular bereitstellen.

In diesem Fall erstellen Sie das Formular und leiten es direkt zur Profilseite weiter. Deshalb sehen Sie leere Formularseite.

+0

Dieses Passwort-Formular sollte im Profil, URL sein. Ich versuche, zwei Formulare in einem HTML zu laden. Es ist unmöglich?? – camila

+0

@camila es ist möglich, aber Sie nicht Formular zur Vorlage zur Verfügung stellen .. habe einen Blick auf die letzte Zeile des Codes, den ich zur Verfügung gestellt habe. Dort habe ich Form, die zu change_password.html gegeben wird –