我正在第二个Django项目。在我的第一个项目中,我使用了所有通用视图,只有最基本的形式使用(for let i=0; i<... etc) {
if (!values["text[" + i + "]"]) {
errors["text[" + i + "]"] = "Insert title";
}
}
直接绑定到自定义用户模型。
在这个项目中,我试图实现用户配置文件功能。我的自定义用户模型具有一些额外的虚拟字段,以便我可以操纵数据。我将此称为UpdateView
模型。我还拥有一个包含地址的CustomUser
模型,因为一个用户可以有多个地址。我曾尝试寻找其他问题,但也遇到了类似的问题,但始终缺少某些内容:
Django class based views - UpdateView with two model forms - one submit
Using Multiple ModelForms with Class-Based Views
Multiple Models in a single django ModelForm?
Django: multiple models in one template using forms
我花了最后一两天的时间来寻找做我想做的“ Django方式”,但是没有运气。我最初的想法是,我可以使用一个模板,并用包装在单个UserAddress
标签中的两个ModelForms进行填充。然后,该视图将处理每种表单并更新<form>
模型,并创建或更新CustomUser
模型。我已经找到了如何使用基础UserAddress
CBV将功能融合在一起的方法,但是我怀疑我正在复制很多我可能已经在Django中发现的功能。这是我的看法,在这里我处理手动实例化的表单,并提供View
。
context
我的class UserDetailsView(View):
def get(self, request):
user = request.user
user_basic = CustomUser.objects.get(pk=user.pk)
basic_form = UserBasicForm(instance=user_basic)
user_address = UserAddress.objects.get(user=user.pk)
billing_address_form = UserAddressForm(instance = user_address)
context = {'basic_form':basic_form,'billing_address_form':billing_address_form}
return render(request, 'mainapp/profile.html', context)
在这一点上是相同的,因为我还没有进行实际的验证和保存。
post
请放心,我将接受大多数建议。
修改 在回顾了其他一些SO问题和Django表单示例之后,看来最终的答案可能不是SO实质性的。也就是说,我的观察是,对于Django内置CBV,“最佳”基础视图是可以最小化或简化所添加代码的视图。在这种情况下,为我的项目使用TemplateView或FormView仅取决于我选择重写或重写的方法,为此,我仍然愿意接受建议。
答案 0 :(得分:1)
我会做这样的事情(with betterforms):
ngOnInit() {
this.sharedService.getDataOnce();
}
然后将模板中的表单重命名为class UserCreationMultiForm(MultiModelForm):
form_classes = {
'basic': UserBasicForm,
'address': UserAddressForm,
}
class UserDetailsView(View):
template = "mainapp/profile.html"
form_class = UserCreationMultiForm
success_url = reverse_lazy('home')
def form_valid(self, form):
# Save the user first, because the profile needs a user before it
# can be saved.
user = form['basic'].save()
address = form['address'].save(commit=False)
address.user = user
address.save()
return redirect(self.get_success_url())
和form.basic