gpt4 book ai didi

django - UpdateView - 更新具有 OneToOne 和 User 的类

转载 作者:行者123 更新时间:2023-12-05 03:14:12 26 4
gpt4 key购买 nike

假设我有一个名为 MyUser 的模型。它有一些字段,其中之一是这个:

user = OneToOneField(User, related_name='more_user_information')

我想制作一个 View 来更新这个模型,我做了以下事情:

Class AccountEdit(LoginRequiredMixin, UpdateView):
model = MyUser
form_class = MyUserForm
template_name = 'accounts/edit.html'

def get_object(self, queryset=None):
return self.model.objects.get(user=self.request.user)

MyUser 中的每个字段都可以很好地编辑,user 除外。这个一对一的字段变成了一个选择下拉框。我喜欢做的是编辑 User 模型上的字段,例如名字或姓氏。

如何在扩展 UpdateView 时实现这一点?或者我应该使用 FormView

谢谢

最佳答案

这个问题实际上与基于类的 View 或更新 View 无关 - 这是一个从一开始就存在的基本问题,即:

ModelForms only edit the fields for one model, and don't recurse into foreign keys.

换句话说,如果你有这样的模型:

class MyModel(models.Model):
a = models.ForeignKey('Foo')
b = models.ForeignKey('Bar')
c = models.ForeignKey('Zoo')
name = models.CharField(max_length=200)

模型表单将呈现三个选择字段,一个用于每个外键,并且这些选择字段将具有列出的那些模型的所有值 - 以及一个用于名称的文本字段。

解决这个问题,需要用到InlineFormSets :

Inline formsets is a small abstraction layer on top of model formsets. These simplify the case of working with related objects via a foreign key.

你应该使用 InlineFormSet来自出色的 django-extra-views 应用程序。为此,您还将为相关对象创建一个 View :

class MyUserInline(InlineFormSet):
model = MyUser

def get_object(self):
return MyUser.objects.get(user=self.request.user)


class AccountEditView(UpdateWithInlinesView):
model = User
inlines = [MyUserInline]

关于django - UpdateView - 更新具有 OneToOne 和 User 的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26200674/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com