python - Signal configured but it still retruns UserProfile matching query does not exist -
the following form returns userprofile matching query not exist. though configured signal.
and works expected inetrpreter.
in [1]: core.models import user in [2]: u = user.objects.get(id = 1) in [3]: user_address = u.get_profile().home_address in [4]: user_address = '20 st.' model
from django.db import models django.contrib.auth.models import user django.db.models.signals import post_save class userprofile(models.model): url = models.urlfield() home_address = models.textfield() user = models.foreignkey(user, unique=true) def create_user_profile(sender, instance, created, **kwargs): if created: userprofile.objects.create(user=instance) post_save.connect(create_user_profile, sender=user) view
from django.contrib.auth.forms import usercreationform django.contrib.auth.models import user, group django import forms django.shortcuts import render_to_response django.http import httpresponse django.template.context import requestcontext django.views.decorators.csrf import csrf_protect class registerform(usercreationform): """ hacking usercreationform class creating child class, , overriding save mthod .save(). should provide email, first_name , last_name fields. """ permission_choices = ( ('1', 'test1'), ('2', 'test2'), ) email = forms.emailfield(required=false) first_name = forms.charfield(required=false) last_name = forms.charfield(required=false) url = forms.urlfield() permission = forms.choicefield(choices=permission_choices) class meta(usercreationform.meta): model = user fields = ('first_name', 'last_name', 'url', 'username', 'email', 'password1', 'password2', 'permission') def save(self, commit=true): user = super(registerform, self).save(commit=false) user_profile = user.get_profile() user.email = self.cleaned_data['email'] user.first_name = self.cleaned_data['first_name'] user.last_name = self.cleaned_data['last_name'] user.permission = self.cleaned_data['permission'] user_profile.url = self.cleaned_data['url'] if commit: user.save() user_profile.save() return user @csrf_protect def register(request): if request.method == 'post': form = registerform(request.post) if form.is_valid(): new_user = form.save() if new_user.permission == '1': try: new_user.groups.add(group.objects.get(name='test1')) except group.doesnotexist: u = user.objects.get(pk=new_user.pk) u.delete() return httpresponse('the organisation you\'ve choosed doesn\' exist') return httpresponse('ok') else: form = registerform() return render_to_response('registration/user.html', {'form': form}, context_instance=requestcontext(request)) like cberner said, think it's because:
i believe you're getting error because call super(registerform, self).save(commit=false). if use commit=false django wouldn't emit post_save signal, since model isn't committed database.
here's solution:
def save(self, commit=true): user = super(registerform, self).save(commit=false) user.email = self.cleaned_data['email'] user.first_name = self.cleaned_data['first_name'] user.last_name = self.cleaned_data['last_name'] user.permission = self.cleaned_data['permission'] user.save() user_profile = userprofile(user=user, url=self.cleaned_data['url']) if commit: user_profile.save() return user
i believe you're getting error because call super(registerform, self).save(commit=false). if use commit=false django wouldn't emit post_save signal, since model isn't committed database.
Comments
Post a Comment