简体   繁体   English

提交后注册表刷新,而不是在 django 中发送 post 请求

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

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视图.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模型.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 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寄存器.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网址.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.谢谢你。

Well, it's a silly mistake.嗯,这是一个愚蠢的错误。 I think by mistake you put request.POST inplace of request.method .我认为您错误地将request.POST代替request.method

In your register view change在您的注册视图中更改

if request.POST == "POST": 

to

if request.method == "POST":

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM