首页 > 解决方案 > 从数据库中获取字段数据以填充已提交表单的用户的表单字段

问题描述

我建立了一个模型表单,我希望用户首先登录然后填写我的表单字段。对于以前没有提交过的新用户,我希望表单为空白。对于之前提交过表单的客户,我想获取发出 GET 请求的登录客户的 ID,并从数据库中检索字段值以填充表单,并使用他之前输入的数据来提交表单。

目前我正在尝试这种方法来获取登录用户的 ID 以填充 views.py 中的字段

cur_customer = Customer.objects.get(id=request.user.id)

然而,这给了我一个错误,说客户匹配查询不存在

那么我将如何实现呢?

视图.py

def multi_form(request):
        form=RegForm()
        if request.method=='POST':
            form=RegForm(request.POST, request.FILES)
            if form.is_valid():
                form.save()
                messages.success(request, "Your Response has been recorded")
                context={'form':form}
                return render(request, 'customer/index.html', context)
            else :
                return render(request, 'customer/index.html', {'form': form})

        else:
            
            cur_customer = Customer.objects.get(id=request.user.id)
            form=RegForm(initial={
                    'first_name':cur_customer.get('first_name',''),
                    'last_name':cur_customer.get('last_name','')})
            context = {'form': form}
            return render(request, 'customer/index.html', context)

模型.py

class Customer(models.Model):

    id=models.AutoField(primary_key=True, default=None)
    customerReg=models.OneToOneField(CustomerReg, on_delete=models.SET_NULL, null=True, blank=True)
    first_name=models.CharField(max_length=200, blank=False, default=None)
    last_name=models.CharField(max_length=200, blank=False, default=None)

class CustomerReg(models.Model):
    user=models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
    name=models.CharField(max_length=200, null=True)
    email=models.EmailField(max_length=254)

标签: djangodjango-modelsdjango-formsdjango-views

解决方案


您可以request.user.is_authenticated在您的视图中使用来检查是否有登录的用户。您当前正在尝试在没有人登录的情况下检索用户,因此您应该将该检查放入您的视图中:

def multi_form(request):
    if request.method=='POST':
        form=RegForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            messages.success(request, "Your Response has been recorded")
            context={'form':form}
            return render(request, 'customer/index.html', context)
        else :
            return render(request, 'customer/index.html', {'form': form})

    else:
        if request.user.is_authenticated:
            form = RegForm(initial={
                'first_name':request.user.first_name,
                'last_name':request.user.last_name})
        else:
            form = RegForm()

        context = {'form': form}
        return render(request, 'customer/index.html', context)

这当然假设您当前的客户和当前登录的用户始终是同一个人。


推荐阅读