从full_name

时间:2015-12-17 10:07:32

标签: django django-registration

当用户在我的应用中注册时,他必须输入full_nameUserModel没有full_name字段,但是first_namelast_name,所以我有一个天真的功能,这对我的用例来说已经足够了:

def split_full_name(full_name):
    if not full_name:
        first_name, last_name = None, None
    else:
        parts = full_name.split(' ')
        if len(parts) == 1:
            first_name = parts[0]
            last_name = None
        elif len(parts) == 2:
            first_name = parts[0]
            last_name = parts[1]
        else:
            first_name = parts[0]
            last_name = ' '.join(parts[1:])
    return first_name, last_name

我按照here所解释的那样覆盖了注册表:

class MyRegistrationForm(RegistrationForm):

    full_name = forms.CharField(required=False)

    def clean_full_name(self):
        full_name = self.cleaned_data['full_name']
        first_name, last_name = split_full_name(full_name)
        self.cleaned_data['first_name'] = first_name
        self.cleaned_data['last_name'] = last_name
        return full_name

first_name中的last_namecleaned_data未保存到模型中。我该怎么做才能实现这个目标?

我已经看到了use of hidden fields,但是我想要一些不那么黑的东西。我可以在表单验证/处理期间手动填充用户实例的某些字段吗?

修改

为了避免混淆:我不想在full_name添加 UserModel字段。我只是使用了股票UserModel,但我想通过允许用户直接输入full_name然后以编程方式生成first_namelast_name来简化表单。

1 个答案:

答案 0 :(得分:1)

尝试在表单的实例上设置名字和姓氏,而不是将其添加到cleaned_data

def clean_full_name(self):
    full_name = self.cleaned_data['full_name']
    first_name, last_name = split_full_name(full_name)
    self.instance.first_name = first_name
    self.instance.last_name = last_name
    return full_name

如果这不起作用,我会尝试覆盖表单的save()方法并在那里设置值。

顺便说一句,您可能会遇到将None分配给first_namelast_name的问题。我会改用空字符串''