我有一个 Django 模型类,它扩展了django.contrib.auth.models.User:
class MyModel(models.Model):
user = models.OneToOneField(User, models.CASCADE, unique=True)
bio = models.TextField()
date_of_birth = models.DateField()
Run Code Online (Sandbox Code Playgroud)
在这个模型中,我正在制作一个 ModelForm:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['bio', 'date_of_birth']
Run Code Online (Sandbox Code Playgroud)
如何告诉 MyModelForm 接受用户的字段,例如username, first_name, last_name?
我可以添加类 Meta 字段中的示例,['bio', 'date_of_birth', 'user']但这只会为我提供下拉菜单,以选择 MyModelForm 中的 MyModel 与谁相关。
做['bio', 'date_of_birth', 'user.first_name']会抛出异常django.core.exceptions.FieldError: Unknown field(s) (user.first_name) specified for MyModel
编辑:这是回溯 https://pastebin.com/0T42VKEP
我有点找到了自己的解决方案,通过覆盖 ModelForm 的__init__方法:
class MyModelForm(forms.ModelForm):
first_name = forms.CharField()
class Meta:
model = MyModel
fields = ['bio', 'date_of_birth']
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
my_user = kwargs.get('instance')
first_name = my_user.user.first_name
self.fields['first_name'].initial = first_name #this will show the first name in the html page when i request the instance
Run Code Online (Sandbox Code Playgroud)
当我实例化我的表单时,我只是将 MyModel 的一个实例作为 kwarg 传递: form = MyModelForm(instance=my_model_instance)