Form is not being saved in Django admin page

Viewed 175

I have faced a problem in my Django project where my form is not being saved as a new listing in my model(listing) and is not even showing on Django's admin page.

my models.py :

class listing(models.Model):
    title = models.CharField(max_length=64)
    describtion = models.CharField(max_length=300)
    bid = models.FloatField()
    category = models.ForeignKey(categories, default=1, verbose_name="Category", 
              on_delete=models.SET_DEFAULT)
    user = models.ForeignKey(User,default='', verbose_name="User", on_delete=models.SET_DEFAULT)
    image = models.CharField(max_length=400)
    def __str__(self):
        return f"{self.title} "

create a new listing form :

        
class create(ModelForm):
    class Meta:
        model = listing
        fields = [ 'title', 'describtion','bid','category','image']

views.py :


def CreateListing(request):
    user = request.user
    if request.method == "POST":
        form = create(request.POST, instance=user)
        if form.is_valid():
            new_listing = form.save()
            new_listing.user = request.user
            new_listing.save()
        return render(request, "auctions/listing.html")
    else:
        return render(request, "auctions/Create.html",{
            "form": create
        })

Ps: I have no problem with my urls.py

1 Answers

You need to set the user before you can save this to the database:

def CreateListing(request):
    user = request.user
    if request.method == "POST":
        form = create(request.POST, instance=user)
        if form.is_valid():
            form.instance.user = user
            form.save()
            return redirect('%name-of-some-view')
    else:
        form = create(instance=user)
    return render(request, "auctions/Create.html",{
        'form': form
    })

Note: You can limit views to a view to authenticated users with the @login_required decorator [Django-doc].


Note: In case of a successful POST request, you should make a redirect [Django-doc] to implement the Post/Redirect/Get pattern [wiki]. This avoids that you make the same POST request when the user refreshes the browser.

Related