将其他参数传递给post_save信号

Amy*_*yth 17 python django

嘿,我的django应用程序中有一个用户注册表,它在用户尝试注册时收集其他数据,如地址,城市,国家,电话号码等.

此数据通过post_save信号保存在Account模型类中.用户创建过程如下所示:

# Function to Create user Account/Profile
def create_user_account(sender, instance, created, **kwargs):
    if created:
      models.Account.objects.create(user=instance)

# 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()
        newuser.save()
    return HttpResponse(username)

#Post Save handler to create user Account/Profile
post_save.connect(create_user_account, sender=User)
Run Code Online (Sandbox Code Playgroud)

这里UserRegistration函数在用户发布表单时调用,在此函数下我可以获取POST数据,我想要的是将该数据传递给create_user_account方法,以便填充Account模型中的字段.

现在我确实看到在数据库中创建了帐户对象,但除用户字段之外的所有字段都是空的.显然,因为POST变量没有传递给create_user_account方法.

Jor*_*ona 16

我所做的是为实例设置一些'_attrs',然后在信号处理程序中使用它们.

我想你的情况可能是:

# 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)
Run Code Online (Sandbox Code Playgroud)

我讨厌做到这一点,我想它可能会以可怕的方式打破,并且有时难以调试,也没有严格的方法来强制处理程序所需的数据,可以定义一个signal_data(data, signal, instance)来定义所需的数据.特定实例的信号处理程序.

我没有尝试的一个不错的选择是使用实例的方法作为信号的处理程序,也许我们可以使用更结构化的方式来传递数据.

再见.

  • 感谢您抽出时间回答这个问题。为了克服这个问题,我基本上决定按照@astynax 的建议在视图本身内部调用帐户模型创建方法 (2认同)