2015-05-30 199 views
0

现在已经读了好几个小时了。仍然不知道这是如何工作的。 我试图在django中验证一个简单的用户配置文件表单,但函数总是返回 - uhm - 什么都没有(?)...即使我尝试打印出form.is_valid()也没有任何回报。django modelform.is_valid()没有结果,没有错误,什么都没有

下面的代码,也许有人有任何想法:

FORMS.PY

class UserForm(ModelForm): 
class Meta: 
    model = User 
    fields = ['username', 'password', 'email', 'first_name', 'last_name'] 

def __init__(self, instance): 
    super(UserForm, self).__init__() 
    self.fields['username'].widget.attrs['readonly'] = True 
    self.fields['password'].widget = forms.PasswordInput() 
    for field in self.fields: 
     self.fields[field].widget.attrs['class'] = 'form-control' 
     self.fields[field].widget.attrs['value'] = getattr(instance, field) 

class UserDataForm(ModelForm): 
class Meta: 
    model = UserProfile 
    fields = ['picture', 'academicDiscipline', 'studentNumber', 'location'] 

def __init__(self, instance): 
    super(UserDataForm, self).__init__() 
    for field in self.fields: 
     if field != 'picture': 
      self.fields[field].widget.attrs['class'] = 'form-control' 
      self.fields[field].widget.attrs['value'] = getattr(instance, field) 

VIEWS.PY

curUser = User.objects.get(pk = request.user.id) 
curUserProfile = curUser.userprofile 
success_msg, error_msg = None, None 

if request.method == 'POST': 
    user = User.objects.get(username__exact = request.POST['username']) 
    userProfile = None 
    user.email = request.POST['email'] 
    user.first_name = request.POST['first_name'] 
    user.last_name = request.POST['last_name'] 
    userForm = UserForm(user) 
    if userForm.is_valid(): 
     user = userForm.save() 
     user.save() 
     success_msg = 'Benutzerdaten wurden erfolgreich aktualisiert.' 
     userProfile = user.userprofile 
     userProfile.academicDiscipline = request.POST['academicDiscipline'] 
     userProfile.studentNumber = request.POST['studentNumber'] 
     userProfile.location = request.POST['location'] 
     userDataForm = UserDataForm(userProfile) 
     if userDataForm.is_valid(): 
      userDataForm.save() 
      userDataForm = userDataForm 
      success_msg = 'Benutzerdaten wurden erfolgreich aktualisiert.' 
     else: 
      error_msg = "userProfileData failure" 
    else: 
     error_msg = 'userData failure' 

    context = { 
     'active_page' : 'settings', 
     'nav': Nav.nav, 
     'success_msg': success_msg, 
     'error_msg': error_msg, 
     'userForm': UserForm(curUser), 
     'userDataForm': UserDataForm(curUserProfile) 
    } 
    return render(request, 'settings.html', context) 
else: 
    context = { 
     'active_page' : 'settings', 
     'nav': Nav.nav, 
     'userForm': UserForm(curUser), 
     'userDataForm': UserDataForm(curUserProfile) 
    } 
    return render(request, 'settings.html', context) 

SETTINGS.HTML

<form action="{% url 'twittur:settings' %}" method="post"> 
{% csrf_token %} 

    {{ userForm.non_field_errors }} 
    {{ userDataForm.non_field_errors }} 

    <div class="post" id="profilbild"> 

     <h4>Profilbild auswählen</h4> 

     <div class="col-xs-12 form-group"> 
      <div class="col-xs-12 text-center" style="vertical-align: bottom !important;"> 
       <img src="/picture/{{ user.picture }}" class="img-thumbnail" style="width: 100px;"> 
       <img src="/picture/{{ user.picture }}" class="img-thumbnail" style="width: 75px; margin-top: 26px;"> 
       <img src="/picture/{{ user.picture }}" class="img-thumbnail" style="width: 50px; margin-top: 50px;"> 
       <p class="help-block">Aktuelles Profilbild (100px, 75px, 50px). {{ user.picture }}</p> 
      </div> 
      <label class="form-label" for="avatarInput">Profilbild aktualisieren</label> 
      {{ userDataForm.picture }} 
      {{ userDataForm.picture.errors }} 
      <!--<input id="avatarInput" name="picture" type="file">--> 
     </div> 

    </div> 

    <div class="post" id="account"> 

     <h4>Accountverwaltung</h4> 

     <div class="col-xs-12 form-group"> 
      <label class="control-label" for="usernameInput">Username</label> 
      <!--<input name="userID" type="hidden" value="{{ user.id }}" />--> 
      {{ userForm.username }} 
      <!--<input class="form-control" id="usernameInput" name="username" type="text" value="{{ user.username }}" disabled />--> 
      <p class="help-block">Der Username kann nicht ver&auml;ndert werden.</p> 
      {{ userForm.username.errors }} 
     </div> 

     <div class="col-xs-12 form-group"> 
      <label class="control-label" for="emailInput">E-Mail</label> 
      {{ userForm.email }} 
      {{ userForm.email.errors }} 
      <!--<input class="form-control" id="emailInput" name="email" type="email" value="{{ user.email }}" />--> 
     </div> 

     <div class="col-xs-12 col-sm-6 form-group"> 
      <label class="control-label" for="pw1Input">Passwort</label> 
      {{ userForm.password }} 
      {{ userForm.password.errors }} 
      <!--<input class="form-control" id="pw1Input" name="password" type="password" value="{{ user.password }}" />--> 
     </div>  
     <div class="col-xs-12 col-sm-6 form-group pull-right"> 
      <label class="control-label" for="pw2Input">Passwort bestätigen</label> 

      {{ userForm.password.errors }} 
      <!--<input class="form-control" id="pw2Input" type="password" value="{{ user.password }}" />--> 
     </div> 

    </div> 

    <div class="post" id="daten"> 

     <h4>Pers&ouml;nliche Daten</h4> 

     <div class="col-xs-12 col-sm-6 form-group"> 
      <label class="control-label" for="vornameInput">Vorname</label> 
      {{ userForm.first_name }} 
      {{ userForm.first_name.errors }} 
      <!--<input class="form-control" id="vornameInput" name="vorname" type="text" value="{{ user.first_name }}" />--> 
     </div>  
     <div class="col-xs-12 col-sm-6 form-group pull-right"> 
      <label class="control-label" for="nachnameInput">Nachname</label> 
      {{ userForm.last_name }} 
      {{ userForm.last_name.errors }} 
      <!--<input class="form-control" id="nachnameInput" name="nachname" type="text" value="{{ user.last_name }}" />--> 
     </div> 

     <div class="col-xs-12 form-group"> 
      <label class="control-label" for="studiengangInput">Studiengang</label> 
      {{ userDataForm.academicDiscipline }} 
      <!--<input class="form-control" id="studiengangInput" name="studiengang" type="text" value="{{ user.academicDiscipline }}" />--> 
      <p class="help-block">Über deinen Studiengang wirst Du bestimmten Gruppen zugeordnet.</p> 
      {{ userDataForm.academicDiscipline.errors }} 
     </div> 

     <div class="col-xs-12 form-group"> 
      <label class="control-label" for="matrikelNummerInput">Matrikel-Nummer</label> 
      {{ userDataForm.studentNumber }} 
      <!--<input class="form-control" id="matrikelNummerInput" name="matrikelnummer" type="number" value="{{ user.studentNumber }}" />--> 
      <p class="help-block">Über deine Matrikel-Nummer kannst Du eindeutig als Student der TU Berlin identifiziert werden.</p> 
      {{ userDataForm.studentNumber.errors }} 
     </div> 

     <div class="col-xs-12 form-group"> 
      <label class="control-label" for="wohnortInput">Wohnort</label> 
      {{ userDataForm.location }} 
      {{ userDataForm.location.errors }} 
      <!--<input class="form-control" id="wohnortInput" name="wohnort" type="text" value="{{ user.location }}" />--> 
     </div> 

    </div> 

    <div class="post" id="seite"> 

     <h4>Seiteneinstellungen</h4> 

     <div class="col-xs-12 form-group"> 
      <label class="control-label" for="stdSafetylevelSelect">Standard-Sicherheitsstufe</label> 
      <select class="form-control" id="stdSafetylevelSelect" name="safety"> 
       <option>public</option> 
       <option>Uni</option> 
       <option>Fakultät</option> 
       <option selected>Studiengang</option> 
      </select> 
     </div> 

    </div> 

    <div class="post" id="delete"> 

     <h4>Account vollst&auml;ndig l&ouml;schen</h4> 

     <div class="col-xs-12 form-group text-center"> 
      <p class="help-block">&Uuml;ber diesen Button kannst Du deinen Account vollst&auml;ndig von unserer Plattform entfernen. Zur Best&auml;tigung der L&ouml;schung erh&auml;lst Du eine E-Mail an deine uns bekannte E-Mail Adresse.</p> 
      <button type="button" class="btn btn-primary text-center" id="deleteButton">Account löschen</button> 
     </div> 

    </div> 

    <div class="col-xs-12 form-group text-center"> 
     <button type="submit" class="btn btn-primary" id="submitSettButton">Speichern</button> 
     <button type="reset" class="btn btn-default" id="resetSettButton">Zur&uuml;cksetzen</button> 
    </div> 

</form> 

我绝对没有线索如何处理它。所以我会很感激每一种帮助!

迎接

回答

1

你永远不POST数据传递到形式:所以它仍然绑定,并通过验证不走。您需要做userDataForm = UserDataForm(request.POST, instance=userProfile)

更糟糕的是,您已经明确定义了表单的方法,因此它们甚至不接受除实例之外的任何参数 - 因此无法用数据填充。另外,他们实际上吞下了instance的参数,并且不会将它传递给超类,所以它被有效地忽略。你应该像这样定义它们:

def __init__(self, *args, **kwargs): 
    instance = kwargs.get('instance') 
    super(UserDataForm, self).__init__(*args, **kwargs) 
+0

哇,非常感谢!这样可行。还要感谢@YPCrumble。之前尝试过,但没有工作。现在我剩下一个概率了。我无法启动userForm。 'userDataForm = UserDataForm(instance = curUserProfile)'工作正常,而'userForm = UserForm(instance = curUser)'不显示任何表单域。虽然'curUser = User.objects.get(pk = request.user.id)'是'curUserProfile = curUser.userprofile' ...也许这是某种与表单冲突的类型? forms.py中的表单现在几乎是相同的。有任何想法吗? –

+0

好的,忘了吧。在行尾有''',破坏了userForm ...再次感谢! –

0

您需要通过直接传递request.POST给它实例化视图窗体 - 你传递一个用户模型实例。

尝试:userForm = UserForm(request.POST)

相关问题