Registration form refreshes after submitting instead of sending post request in django

Tags: , , , ,



I’m trying to register a user but the page refreshes instead of submitting the data.

At the initial stage of my project, it was working properly but when I added some more models and form it’s not working and tried to register it stopped working.

and it also doesn’t throw any errors

views.py

from django.shortcuts import render
from django.contrib.auth import authenticate,login,logout
from .models import *
from django.http import HttpResponseRedirect
from django.urls import reverse
from .form import *
from django.db import IntegrityError
from django.contrib.auth.decorators import login_required
from django.contrib import messages
# Create your views here.

def index(request):
    if not request.user.is_authenticated:
        message = f"please sign in"
    else :
        message = f"signed in as {request.user}"
    return render(request, "auctions/index.html",{
        "listings": Listings.objects.all(),
        "message": message
    })

def login_view(request):
    if request.method == "POST":
        form = loginForm()
        email = request.POST["email"]
        password = request.POST["password"]
        user = authenticate(request,username=email,password=password)

        if user is not None:
            login(request,user)
            return HttpResponseRedirect(reverse('index'))
        else:
            return render(request, "auctions/login.html",{
                "form": form ,
                "message": "username/password not valid"
            })
    return render(request, "auctions/login.html",{
        "form": loginForm()
    })

def logout_view(request):
    logout(request)
    return HttpResponseRedirect(reverse('index'))

def register(request):
    if request.POST == "POST":
        form = registerForm()
        email = request.POST["email"]

        # check passwords are same
        password = request.POST["password"]
        confirmation = request.POST["id_confirmation"]

        if password != confirmation:
            return render (request, "auctions/register.html",{
                "form": form,
                "message": "Passwords does not match"
            })
        
        # Attempt to create new user
        try:
            user = myUser.objects.create_user(email,password)
            user.save()
        except IntegrityError:
            return render(request, "auctions/register.html", {
                "form":form,
                "message": "Username is already taken"
            })

        login(request,user)
        return HttpResponseRedirect(reverse('index'))

    return render(request, "auctions/register.html", {
        "form": registerForm()
    })

@login_required(login_url='login')
def createListing(request):

    form = createListingForm(request.POST or None, request.FILES or None)

    if request.method == "POST":
        
        if form.is_valid():
            obj = form.save(commit=False)
            obj.listed_by = request.user
            obj.save()
            messages.success(request,"Creation successful")
        return HttpResponseRedirect(reverse('index'))

    return render(request, "auctions/create.html", {
        "form": form    
        })


def itemPage(request,listing_id):
    return render(request, "auctions/item.html", {
        "item" : Listings.objects.get(pk= listing_id)
    })

# still working on it
@login_required(login_url='login')
def bid(request):
    if request.method == "POST":
        new_bid = request.POST["new_bid"]

    return HttpResponseRedirect('itemPage')

models.py

from django.db import models
from django.contrib.auth.models import AbstractUser,BaseUserManager
from django.utils.translation import ugettext_lazy as _
from django.conf import settings

# Create your models here.
class myUserManager(BaseUserManager):
    """
    custom user model manager where email is unique indentifiers for authenticaton
    instead of usernames.
    """

    def create_user(self, email, password, **extra_fields):
        """
        Create and save a User with the given email and password.
        """
        if not email:
            raise ValueError(_('The Email must be set'))
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save()

        return user

    def create_superuser(self, email, password, **extra_fields):

        """
        Create and save a SuperUser with the given email and password.
        """

        extra_fields.setdefault('is_staff',True)
        extra_fields.setdefault('is_superuser',True)
        extra_fields.setdefault('is_active',True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError(_('Superuser must have is_staff= True'))
        if extra_fields.get('is_superuser') is not True:
            raise ValueError(_('Superuser must have is_superuser=True.'))
        return self.create_user(email,password, **extra_fields)

class myUser(AbstractUser):
    username = None
    email = models.EmailField(_('email address'), unique=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = myUserManager()

    def __str__(self):
        return f'{self.email}'

class Listings(models.Model):
    listing_name = models.CharField(max_length=50)
    price = models.IntegerField(default=1)
    date_listed = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)
    item_image = models.ImageField()
    description = models.TextField(max_length=200, default="Description Not Available")
    listed_by = models.ForeignKey(myUser,on_delete=models.CASCADE, default=1,null=True)
    
    def __str__(self):
        return f'{self.listing_name}'

# added later not complete
class Bid(models.Model):
    item_name = models.ForeignKey(Listings,on_delete=models.CASCADE)
    bid_by_user = models.ForeignKey(myUser,on_delete=models.CASCADE)
    new_bid = models.IntegerField()

forms.py

from django.forms import ModelForm
from django.db import models
from django import forms
from django.forms import Form,PasswordInput
from .models import *
from django.contrib.auth.mixins import LoginRequiredMixin

class loginForm(forms.ModelForm):

    class Meta:
        model = myUser
        
        fields = ['email', 'password']

        widgets = {
            # telling Django your password field in the mode is a password input on the template
            'password': forms.PasswordInput()
        }

class registerForm(forms.ModelForm):
    confirmation = forms.CharField()

    class Meta:
        model = myUser

        fields = ['email', 'password']

        widgets = {
            
                # telling Django your password field in the mode is a password input on the template
                'password': forms.PasswordInput()
            
        }

class createListingForm(forms.ModelForm):

    class Meta:
        model = Listings

        fields = ['listing_name', 'price', 'item_image', 'description']

register.html

{% load static %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">

</head>
<body>
    <div class="container">
        <div class="login_form">
            <strong class="tilte">Register</strong>
            <form action="{% url 'register' %}" method="POST"> 
               
                {% if message %}
                    <div >
                        {{message}}
                    </div>
                {% endif %}
                    
                {% csrf_token %}
                {{ form.as_p }}
                <input class="btn btn-primary" type="submit" value="Register">
                <small>If already registered click here to <a href="{% url 'login' %}">Login</a></small>
            </form>
        </div>
    </div>
</body>
</html>

urls.py

urlpatterns = [
    path('', views.index, name='index'),
    path('login/', views.login_view, name='login'),
    path('logout/', views.logout_view, name='logout'),
    path('register/', views.register, name='register'),
    path('create_listing/', views.createListing, name='create'),
    path('item/<int:listing_id>', views.itemPage, name='item'),
    path('bid/', views.bid, name='bid')
]

I would also like to request some other suggestions on my code. Thank you.

Answer

Well, it’s a silly mistake. I think by mistake you put request.POST inplace of request.method.

In your register view change

if request.POST == "POST": 

to

if request.method == "POST":


Source: stackoverflow