LastCodebender
LastCodebender

Reputation: 67

How do I set value for foreign key field?

enter image description here

I want to set the value for this CustomerReg in picture above to request.user.username I am able to manually select it, what I want is after login it gets directly assigned to person who has logged in to submit this form.

views.py(multi_form view and register view)

I cannot automatically assign CustomerReg field in Customer model.

def registerPage(request):
    if request.user.is_authenticated:
        return redirect('form')
    else:
        form=CreateUserForm()

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

            if(form.is_valid()):
                form.save()

                user=form.cleaned_data['username']
                messages.success(request, 'Account created for '+ user)
                return redirect('login')

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

models.py(Customer and CustomerReg model) Customer model has customerReg field as foreign key.

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)
    

def create_profile(sender, **kwargs):
    if kwargs['created']:
        user_profile=CustomerReg.objects.create(user=kwargs['instance'])

post_save.connect(create_profile, sender=User)

class Customer(models.Model):

    id=models.AutoField(primary_key=True, default=None)
    customerReg=models.ForeignKey(User, 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)

forms.py

class RegForm(ModelForm):
    class Meta:
        model=Customer
        fields=['first_name', 'last_name']
        widgets={
            'first_name':forms.TextInput(attrs={'class': 'form-control', 'placeholder':"First Name", 'style': 'border-color:hsl(0, 0%, 0%); border-radius: 10px; border-width: 1px;'}),
            'last_name':forms.TextInput(attrs={'class': 'form-control', 'placeholder':"Last Name", 'style': 'border-color:hsl(0, 0%, 0%); border-radius: 10px; border-width: 1px;'}),
}

Upvotes: 0

Views: 438

Answers (1)

sirrobot01
sirrobot01

Reputation: 66

In your form Meta class, add 'customerReg' to exclude list. Then in your registerPage view,

def registerPage(request):
if request.user.is_authenticated:
    return redirect('form')
else:
    form=CreateUserForm()

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

        if(form.is_valid()):
            reg = form.save(commit=False)
            reg.customerReg = request.user
            reg.save()
            messages.success(request, 'Account created for '+ user)
            return redirect('login')

Upvotes: 1

Related Questions