Django识别基于类的视图并形成多个模型

时间:2019-03-09 14:32:36

标签: django django-models django-forms django-templates django-views

我正在第二个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仅取决于我选择重写或重写的方法,为此,我仍然愿意接受建议。

1 个答案:

答案 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