Search code examples
pythondjangodjango-modelsdjango-formsdjango-orm

django: get() returned more than one Freelancers -- it returned 3


i am trying to assign a freelancer to a particular gig but it shows get() returned more than one Freelancers -- it returned 3!. I have tried getting the logged in freelancer to is trying to create the git like this freelancer = get_object_or_404(Freelancers, user=user) and before i save the form i assign the value like this new_form.creator = freelancer .

views.py

@login_required
def create_gig(request):
    user = request.user
    freelancer = get_object_or_404(Freelancers, user=user)
    if request.method == "POST":
        form = CreateGig(request.POST, request.FILES)
        if form.is_valid():
            new_form = form.save(commit=False)
            new_form.user = request.user
            new_form.creator = freelancer
            new_form.slug = slugify(new_form.title)
            
            new_form.save()
            messages.success(request, f'Gig Created Successfully, Would be Live Soon')
            return redirect('freelance:listings')
    else:
        form = CreateGig()
    context = {
        'form': form
        }
    return render(request, 'freelance/create.html', context)

models.py

class Gigs(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='gig_user')
    creator = models.ForeignKey(Freelancers, on_delete=models.CASCADE, related_name='gig_creator')
    title = models.CharField(max_length=1000, null=True, blank=True, verbose_name="Enter what you will do", default=" I will ")

Solution

  • In my code, it is getting a logged-in user instance and then creating the gig by assigning the freelancer to the created form.

    @login_required
        def create_gig(request):
            freelancer = Freelancers.objects.get(user = request.user )
            if request.method == "POST":
                form = CreateGig(request.POST, request.FILES)
                if form.is_valid():
                    new_form = form.save(commit=False)
                    new_form.creator = freelancer
                    new_form.slug = slugify(new_form.title)
                    
                    new_form.save()
                    messages.success(request, f'Gig Created Successfully, Would be Live Soon')
                    return redirect('freelance:listings')
            else:
                form = CreateGig()
            context = {
                'form': form
                }
            return render(request, 'freelance/create.html', context)
    

    You also don't need this line in your view:

    new_form.user = request.user