【问题标题】:Django Customer with onetoone relationship with User - how to create the fields for that model when creating User?与用户具有一对一关系的 Django 客户 - 创建用户时如何为该模型创建字段?
【发布时间】:2022-01-09 15:04:35
【问题描述】:

这是我的问题 - 在 django 中创建用户后,我还想创建具有 Onetoone 关系的客户。我能够让这个工作,但是当我无法创建字段时问题就开始了 - dob 和 mobile。 (用户是默认的 django 用户)

我的表单.py

    class CreateUserForm(UserCreationForm):
    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']
    mobile = CharField(max_length=30)
    
class CreateCustomerForm(ModelForm):
    class Meta:
        model = Customer
        fields = ['mobile', 'dob']

我的模型.py

class Customer(Model):
    user = OneToOneField(User, on_delete=CASCADE)
    mobile = CharField(max_length=12,null=True)
    dob = DateField(null=True)

    def __str__(self):
        return self.user.username

我的意见.py

def customer_registration(request):
    form = CreateUserForm()

    if request.method == 'POST':
        form = CreateUserForm(request.POST)
        if form.is_valid():
            user = form.save()
            username = form.cleaned_data.get('username')
            group = Group.objects.get(name='customer')
            user.groups.add(group)
            Customer.objects.create(
                user=user, 
            )
            messages.success(request, 'Account was created for ' + username)
            return redirect('index')
    context = {'form': form}
    return render(request, 'signup.html', context)

我需要在该客户模型中再添加 2 个字段(dob=form.dob,mobile=form.mobile),我试图为此使用第二种形式,但它不起作用。这是我尝试过的:

def customer_registration(request):
    form = CreateUserForm()
    form2 = CreateCustomerForm()

    if request.method == 'POST':
        form = CreateUserForm(request.POST)
        if form.is_valid():
            user = form.save()

            username = form.cleaned_data.get('username')
            group = Group.objects.get(name='customer')
            user.groups.add(group)
            if request.method == 'POST':
                form2 = CreateCustomerForm(request.POST)
                
                mobile = form2['mobile']

                Customer.objects.create(
                user=user, mobile=mobile)
                messages.success(request, 'Account was created for ' + username)
                return redirect('index')
            else:
                print('Error')
    context = {'form': form, 'form2': form2}
    return render(request, 'signup.html', context)

和:

def customer_registration(request):
    form = CreateUserForm()
    form2 = CreateCustomerForm()

    if request.method == 'POST':
        form = CreateUserForm(request.POST)
        form2 = CreateCustomerForm(request.POST)
        if form.is_valid() and form2.is_valid():
            user = form.save()
            mobile = form2.save()
            username = form.cleaned_data.get('username')
            group = Group.objects.get(name='customer')
            user.groups.add(group)
            Customer.objects.create(
                user=user, mobile=mobile,
            )
            messages.success(request, 'Account was created for ' + username)
            return redirect('index')
    context = {'form': form, 'form2': form2}
    return render(request, 'signup.html', context)

这个我真的有货。有什么想法吗?

【问题讨论】:

    标签: python django django-views django-forms one-to-one


    【解决方案1】:

    唯一的问题是你的CreateCustomerForm没有给Customeruser字段赋值,你可以设置.instance.user包裹在第二种形式(form2 ):

    def customer_registration(request):
        form = CreateUserForm()
        form2 = CreateCustomerForm()
    
        if request.method == 'POST':
            form = CreateUserForm(request.POST)
            form2 = CreateCustomerForm(request.POST)
            if form.is_valid() and form2.is_valid():
                user = form.save()
                form2.instance.user = user  # ? assign to the user of the customer
                form2.save()
                username = user.username
                messages.success(request, f'Account was created for {username}')
                return redirect('index')
        context = {'form': form, 'form2': form2}
        return render(request, 'signup.html', context)

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 1970-01-01
      • 2017-07-22
      • 2017-12-21
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      • 2017-08-07
      • 2017-03-19
      相关资源
      最近更新 更多