如何在Django表单中将ForeignKey字段呈现为CharField

时间:2014-03-21 00:03:50

标签: django django-forms

我的模特

class Collaborator(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL)

我的表格:

class CollaboratorForm(forms.ModelForm):
    user = forms.CharField(max_length=30, required=False)
    class Meta:
        model = Collaborator
        fields = ('user',)

模板将用户输入文本呈现为从autocomplete模型加载的User字段。

该页面正确显示了用户输入文本字段,但是当我去编辑协作者时,用户输入文本字段显示用户ID 我想显示用户名而不是。

1 个答案:

答案 0 :(得分:1)

您想先了解您想要的确切行为。

让我们说我的用户ID = 1,用户名=" Joel"。当您制作CollaboratorForm并显示" Joel" (我的用户名)在表单上,​​你编辑它以阅读"简",你是:

  • 尝试将我的名字编辑为" Jane",以便id = 1现在有一个用户名= Jane?
  • 或尝试将关联用户更改为与该用户名匹配的用户?

一旦你知道,你可以继续。

我将user = forms.CharField(..)更改为username = forms.CharField(..);毕竟,那是你真正表现出来的东西。

在您的视图中,在创建表单时,请将初始值传递给{'username':username-of-user-that-is-currently-related}

在您的视图中,当您处理表单时,在保存表单之前,请使用cleaned_data['username'](a)更新该用户的用户名(如果上面的第一个案例)或(b)获取ID新用户并将其保存到.user字段(如果是上面的第二种情况)。

当然,如果您想要的是真正处于更高级别的人,那么让人们根据用户名选择用户",您可能能够以不同的方式更轻松地解决这个问题 - 不使用完全是CharField,而是使用ChoiceField,因此您可以使用key = ID和value = name显示用户的下拉菜单。但是,根据您拥有的用户数量,可能无法很好地扩展。