python - User got saved in django regardless of other two forms with it are valid or not -
userform got saved no matter if other 2 forms (studentorfacultyform , useridform) valid or not. user should not created if other 2 forms invalid. please help!
models.py
class studentorfaculty(models.model): student = 's' faculty = 'f' profile_choices = ( (student, 'student'), (faculty, 'faculty'), ) # links user model instance user = models.onetoonefield(user, related_name='fors') # additional attributes st_or_faculty = models.charfield(max_length=1, choices=profile_choices) def __str__(self): if(self.st_or_faculty == 's'): fullname = 'student' elif(self.st_or_faculty == 'f'): fullname = 'faculty' else: fullname = 'unknown' return str(self.user) + " " + fullname class useractivation(models.model): user = models.onetoonefield(user) activation_key = models.charfield(max_length=255, blank=true) key_expires = models.datetimefield(default=(timezone.now() + timedelta(days=1))) def __str__(self): return self.user.username class meta: verbose_name_plural=u'activation' class useridcard(models.model): user = models.onetoonefield(user) id_card = models.imagefield(upload_to='id_cards') forms.py
fors_choices = (('f','faculty'),('s','student')) class userform(forms.modelform): first_name = forms.charfield(help_text="frist name") last_name = forms.charfield(help_text="last name") username = forms.charfield(help_text="username") email = forms.charfield(help_text="email") password = forms.charfield(widget=forms.passwordinput(), help_text="password") class meta: model = user fields = ('first_name', 'last_name', 'username', 'email', 'password') def clean_email(self): email = self.cleaned_data.get('email') username = self.cleaned_data.get('username') if email , user.objects.filter(email=email).exclude(username=username).count(): raise forms.validationerror(u'this email registered.') return email class studentorfacultyform(forms.modelform): """ studentorfaculty option """ st_or_faculty = forms.choicefield( label="student or faculty", required=true, choices=fors_choices, widget=forms.radioselect, help_text="student or faculty") class meta: model = studentorfaculty fields = ('st_or_faculty',) class useridcardform(forms.modelform): id_card = forms.imagefield(label="college id card") class meta: model = useridcard fields = ('id_card',) def clean_id_card(self): image = self.cleaned_data.get('id_card',false) if image: if hasattr(image,'_size'): if image._size > 4*1024*1024: raise validationerror("image file large (should < 4mb )") return image else: raise validationerror("couldn't read uploaded image") views.py
def user_signup(request): # request's context context = requestcontext(request) if request.user.is_authenticated(): return httpresponseredirect(reverse('notices:index')) # boolean value telling template whether signup successfull # set flase initially. code changes value true when registration #successfull registered = false # if it's http post, we're interested in processing form data if request.method == 'post': # attempt grab information # make use of userforrm , userprofileform user_form = userform(data=request.post) student_or_faculty_form = studentorfacultyform(data=request.post) user_id_card_form = useridcardform(data=request.post, files=request.files) # if 2 foms valid if user_form.is_valid() , student_or_faculty_form.is_valid() and\ user_id_card_form.is_valid(): # save user's form data database. user = user_form.save() # hash password set_password method. # 1 hashed, can update user object. user.set_password(user.password) user.is_active = false user.save() uid = user_id_card_form.save(commit=false) uid.user = user uid.save() fors = student_or_faculty_form.save(commit=false) fors.user = user fors.save() username = user_form.cleaned_data['username'] email = user_form.cleaned_data['email'] tmp = random.random() tmp = str(tmp) tmp = tmp.encode('utf-8') salt = hashlib.sha1(tmp).hexdigest()[:5] salt = salt.encode('utf-8') email_en = email.encode('utf-8') activation_key = hashlib.sha1(salt+email_en).hexdigest() key_expires = datetime.datetime.today() + datetime.timedelta(2) email = user_form.cleaned_data['email'] #get user username user=user.objects.get(username=username) new_profile = useractivation(user=user, activation_key=activation_key, key_expires=key_expires) new_profile.save() # send email activation key email_subject = 'account confirmation' email_body = "hey %s, signing up. activate account, click link within \ 48hours http://www.socialboard.in/accounts/confirm/%s" % (username, activation_key) send_mail(email_subject, email_body, 'support@socialboard.in', [email], fail_silently=false) # log in user user_name = request.post['username'] '''new_user = authenticate(username=request.post['username'], password=request.post['password']) login(request, new_user)''' # update variable tell registration successful registered = true return httpresponseredirect(reverse('accounts:aftersignup', kwargs={'user_name':user_name})) # invalid forms # print problems terminal. # show user else: print( user_form.errors, student_or_faculty_form.errors, user_id_card_form.errors ) # not http post, render our form using 2 instance # these forms blank, ready user input. else: user_form = userform() student_or_faculty_form = studentorfacultyform() user_id_card_form = useridcardform() # render template depending on context. return render_to_response( 'accounts/signup.html', { 'user_form': user_form, 'student_or_faculty_form': student_or_faculty_form, 'user_id_card_form': user_id_card_form, 'registered': registered}, context) signup.html
<form class="form-horizontal" role="form" id="user_form" method="post" action="{% url 'accounts:signup' %}" enctype="multipart/form-data"> {% csrf_token %} {% field in user_form.visible_fields %} <div class="form-group has-feedback"> <div class="col-sm-12"><input type="{{ field.field.widget.input_type }}" class="form-control" name="{{ field.name }}" placeholder="{{ field.label}}" value="{% if field.value %}{{field.value}}{% endif %}"></div> {% if field.errors %} <div class="col-sm-10 text-danger"> {{ field.errors }} </div> {% endif %} </div> {% endfor %} {% fieldi in student_or_faculty_form.visible_fields %} <div class="from-group has-feedback"> <!--<label class="col-sm-2 control-label">i </label>--> {% value,text in fieldi.field.choices %} <label class="radio-inline"> <input type="radio" name="{{ fieldi.name }}" id="" value="{{ value }}"><b> {{ text }}</b> </label> {% endfor %} {% if fieldi.errors %} <div class="col-sm-10 text-danger "> {{ fieldi.errors }} </div> {% endif %} </div> {% endfor %} <br> {% field in user_id_card_form.visible_fields %} <div class="form-group has-feedback"> <div class="col-sm-12"><b>{{field.field.label}} :</b></div> <div class="col-sm-12"><input type="{{ field.field.widget.input_type }}" class="form-control" name="{{ field.name }}" placeholder="{{ field.label}}" value="{% if field.value %}{{field.value}}{% endif %}"></div> {% if field.errors %} <div class="col-sm-10 text-danger"> {{ field.errors }} </div> {% endif %} </div> {% endfor %} <!-- provide button click submit form --> <div class="form-group"> <div class="col-sm-offset-0 col-sm-10"> <button type="submit" class="btn btn-warning"><b>sign up</b></button><br><br> <div>or have account? <a href="{% url 'accounts:login' %}"><span class="btn btn-xs btn-default">log in</span></a></div> </div> </div> </form>
Comments
Post a Comment