What I do is to set some '_attrs' to the instance and then use them in the signal handler.
I imagine your case could be:
# Function to Create user Account/Profile
def create_user_account(sender, instance, created, **kwargs):
if created:
attrs_needed = ['_language', '_field', '_otherfield']
if all(hasattr(instance, attr) for attr in attr_needed):
models.Account.objects.create(
user=instance,
language=instance._language,
field=instance._field,
otherfield=instance._otherfield)
# Create User / User Registration
def UserRegistration(request):
if request.method == 'POST':
username = request.POST['fn'].capitalize() + ' ' + request.POST['ln'].capitalize()
# CREATE USER
newuser = User.objects.create_user(
username=username, email=request.POST['email'],
password=request.POST['pw'])
newuser.first_name = request.POST['fn'].capitalize()
newuser.last_name = request.POST['ln'].capitalize()
# Set some extra attrs to the instance to be used in the handler.
newuser._language = request.POST['language']
newuser._field = request.POST['field']
newuser._otherfield = request.POST['otherfield']
newuser.save()
return HttpResponse(username)
#Post Save handler to create user Account/Profile
post_save.connect(create_user_account, sender=User)
I hate to do this, and I imagine it can breaks in horrible ways, and is hard to debug sometimes, also there is no a strict way to force the data needed for the handler, one could define a signal_data(data, signal, instance)
to define the data needed for the signal handler for a particular instance.
A nice option that I haven't tried is to use methods of the instance as signal's handlers and maybe we can use a more structured way to pass the data.
Bye.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…