Получить данные поля из базы данных для заполнения полей формы для пользователя, который уже отправил форму

#django #django-models #django-forms #django-views

#django #django-модели #django-forms #django-просмотры

Вопрос:

Я создал типовую форму, в которой я хочу, чтобы пользователь сначала вошел в систему, а затем заполнил поля моей формы. Для нового пользователя без предыдущей отправки я хочу, чтобы форма была пустой. Для клиента, который отправил форму ранее, я хочу получить идентификатор этого вошедшего в систему клиента, делающего запрос GET, и получить значения полей из базы данных для заполнения формы данными, которые он ранее ввел для отправки формы.

На данный момент я пытаюсь использовать этот подход, чтобы получить идентификатор зарегистрированного пользователя для заполнения полей в views.py

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

Однако это выдает ошибку, в которой говорится, что запрос соответствия клиента не существует.

Итак, как бы мне это реализовать?

views.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)
  

models.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)
  

Ответ №1:

Вы можете использовать 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)
  

Это, конечно, предполагает, что ваш текущий клиент и пользователь, который в данный момент вошел в систему, всегда являются одним и тем же человеком.

Комментарии:

1. Ошибка атрибута в объекте /form / ‘User’ не имеет атрибута ‘get’, Это то, что я получаю сейчас.

2. @Shaurya попробуйте использовать request.user.first_name и request.user.last_name

3. никаких эффектов при перезагрузке страницы. Поля пусты.

4. if request.user.is_authenticated: form = RegForm(initial={ 'first_name':request.user.first_name, 'last_name':request.user.last_name}) Это мой измененный код @voodoo-burger

5. @Shaurya вы уверены, что имена ваших полей формы — first_name и last_name ?