I am trying to add an extra user profile registration field using 
registration. Should be so simple but this is bringing me to the edge.

Here's my stackoverflow question with 
bounty: 
https://stackoverflow.com/questions/23695713/django-reg-extend-current-transaction-is-aborted-commands-ignored-until-end-o


Basically I want to add a '*city*' field to the registration form. I have 
tried many solutions, but am currently attempting versions of this: 
http://dmitko.ru/django-registration-form-custom-field/

In my app I have a backend *regbackend.py *relying on django-registration's 
signals:

______________________________________________

from forms import *
from models import UserProfile
from django.db.models.signals import post_save


def user_created(sender, user, request, **kwargs):
new_user = RegistrationProfile.objects.get(us)
    form = CustomRegistrationForm(request.POST)
    data = UserProfile(user=user)
    import ipdb; ipdb.set_trace();
    data.locality = form.data["locality"]
    data.save()

from registration.signals import user_registered
import crewcal.models
user_registered.connect(user_created)
______________________________________________


The related models:

______________________________________________

class Locality(models.Model):
    locality = models.CharField(max_length=50)

    def __unicode__(self):
        return self.locality

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    event_commitments = models.ManyToManyField(Event,
        null=True, blank=True)
    receive_email = models.BooleanField(default=True)
    locality = models.ManyToManyField(Locality,
        null=True, blank=True)

    def __unicode__(self):
        return self.user.username

    @property
    def url(self):
        return self.get_absolute_url()

    @models.permalink
    def get_absolute_url(self):
        return ('crewcal.views.profile', [str(self.id)])

userprofile_created = django.dispatch.Signal(providing_args=["user", 
"request"])

def create_user_profile(sender, instance, created, raw, **kwargs):
    if created and not raw:
        UserProfile.objects.create(user=instance)
        profile = UserProfile.objects.get(user=instance)
        userprofile_created.send(sender=UserProfile,
            user=instance, request=request)

post_save.connect(create_user_profile, sender=User)

User.profile = property(lambda u: UserProfile.\
     objects.get_or_create(user=u)[0])
______________________________________________


I get a mixture of errors (dependent on the slight tweaks I make), such as:

current transaction is aborted, commands ignored until end of transaction 
block

and:

"<UserProfile: ppokkutt>" needs to have a value for field "userprofile" before 
this many-to-many relationship can be used.


This last message suggests to me that the UserProfile is not saved before the 
signal is sent (from the *django-registration* plugin) to the custom backend 
(*regbackend.py* above) which attempts to update that non-existent entry with 
the locality. Here is the relevant code from *django-registration views.py:*

______________________________________________

    def register(self, request, **cleaned_data):

        """

        Given a username, email address and password, register a new

        user account, which will initially be inactive.


        Along with the new ``User`` object, a new

        ``registration.models.RegistrationProfile`` will be created,

        tied to that ``User``, containing the activation key which

        will be used for this account.

        After the ``User`` and ``RegistrationProfile`` are created and the 
activation email is sent, the signal

        ``registration.signals.user_registered`` will be sent, with

        the new ``User`` as the keyword argument ``user`` and the

        class of this backend as the sender.

        """

        username, email, password = cleaned_data['username'], 
cleaned_data['email'], cleaned_data['password1']

        if Site._meta.installed:

            site = Site.objects.get_current()

        else:

            site = RequestSite(request)

        new_user = RegistrationProfile.objects.create_inactive_user(username, 
email, password, site)

        signals.user_registered.send(sender=self.__class__,

                                     user=new_user,

                                     request=request)

        return new_user

______________________________________________

and from models.py:


______________________________________________

    def create_inactive_user(self, username, email, password,

                             site, send_email=True):

        """

        Create a new, inactive ``User``, generate a

        ``RegistrationProfile`` and email its activation key to the

        ``User``, returning the new ``User``.

        By default, an activation email will be sent to the new

        user. To disable this, pass ``send_email=False``.

        """

        new_user = User.objects.create_user(username, email, password)

        new_user.is_active = False

        new_user.save()

        registration_profile = self.create_profile(new_user)

        if send_email:

            registration_profile.send_activation_email(site)

        return new_user

    create_inactive_user = transaction.commit_on_success(create_inactive_user)
______________________________________________



Any thoughts would be much appreciated!

Matt


-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/32e0edb8-5ff8-427f-bc69-6766b774011d%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to