Django如何保存两个不同的类,它们通过一个表单中的OneToOne关系相互连接?

时间:2016-10-06 03:15:08

标签: python django forms

让我更详细地解释一下我的问题。

首先,我有一个班级' UserInfo'它连接到django.contrib.auth.models的User类,如下所示

models.py

class UserInfo(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    phone = models.CharField(max_length=15,blank=True,unique=True)
    position = models.CharField(max_length=15,blank=True,unique=True)

    class Meta:
        default_permissions = ()

    def __str__(self):
        return self.position

然后我想使用ModelForm,因为我可以编写更少的代码。我创建CreateNewUser类的原因是我想让用户只能看到[用户名,电子邮件,组,user_permissions]并控制它们。 (以防止他们选择超级用户或员工或非活动选项)

forms.py

class CreateNewUserInfo(forms.ModelForm):
    class Meta:
        model = UserInfo
        fields = '__all__'

class CreateNewUser(forms.ModelForm):
    class Meta:
        model = User
        fields = ['username', 'email', 'groups', 'user_permissions']

问题发生在这里。我想使用FormView来使用带类类型视图的通用视图,这样我就可以编写更少的代码(简洁的代码)。有一个名为' form_class'而且我无法用两个不同的课程。我想把不同的两个类放到一个具有通用视图的表单中。

views.py

class TestView(FormView):
    form_class = CustomForm
    template_name = 'manager/alltoall.html'

    def form_valid(self, form):

最后,我在forms.py中创建了新类,并编写了我需要的每个字段,如下所示。

forms.py

class CustomForm(forms.Form):
    username = forms.CharField(initial='testname',max_length=150)
    email = forms.EmailField()
    phone_number = forms.CharField(max_length=15)
    position = forms.CharField(max_length=15)

views.py

class TestView(FormView):
    form_class = CustomForm
    template_name = 'manager/alltoall.html'

    def form_valid(self, form):
        username = form.cleaned_data['username']
        email = form.cleaned_data['email']
        phone_number = form.cleaned_data['phone_number']
        position = form.cleaned_data['position']

        with transaction.atomic():
            user = User.objects.create(username=username,email=email)
            userinfo = UserInfo.objects.create(user=user,phone=phone_number,position=position)
            userinfo.save()
            user.save()

        return super(TestView, self).form_valid(form)

无论如何使用ModelForm和FormView同时在表单中显示两个不同的类?另外,我使用了上面的事务,因为我想用两个不同的类将数据保存在数据库中。它是正确的方法还是有其他方法可以更方便(或有效)使用django中的内置函数来做到这一点?

感谢您抽出宝贵时间阅读所有内容。我想知道它是否太长了,但我想提供我想要确切知道的东西。谢谢!

0 个答案:

没有答案