【问题标题】:Populate first_name and last_name from full_name从 full_name 填充 first_name 和 last_name
【发布时间】:2015-12-17 10:07:32
【问题描述】:

当用户在我的应用中注册时,他必须输入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

cleaned_data 中的first_namelast_name 不会保存到模型中。我应该怎么做才能做到这一点?

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

编辑

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

【问题讨论】:

  • @ofnowhereland:我不需要自定义用户模型。它有我需要的一切。
  • @Sayse:也许我还不够清楚。 full_name 只是一个表单字段,而不是用户模型字段。用户模型中的字段确实是first_namelast_name(在stock UserModel 中定义),而not full_name,所以没有重复。我只是不想强迫用户在表单中填写两个单独的字段。
  • 啊,好吧,所以这纯粹是一个几乎是装饰性的前端东西(或者无论如何都是可用性)。我本来希望您提供的表单代码可以工作....您对此是否有任何错误(表单无效?)? (我已经删除了我以前的 cmets 以消除您问题中的噪音)
  • @Sayse:是的,我想你可以称之为可用性。而且完全没有错误,但是模型字段first_namelast_name 没有填充。

标签: django django-registration


【解决方案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 时遇到问题。我会改用空字符串''

【讨论】:

  • 效果很好,谢谢!我不明白 cleaned_datainstance 值的作用是什么。这是否记录在某处?
  • 每个表单都有一个干净的方法返回cleaned_dataModelForms 也有一个instance,它是正在编辑的(现有的或新的)对象。验证表单后,cleaned_data 中的值用于更新instance。在你的情况下,因为RegistrationForm没有first_namelast_name字段,将它们添加到cleaned_data是行不通的,所以我们直接修改实例。您可能会发现 validation on a model form 的文档很有用。
猜你喜欢
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多