Регистрация перенаправление домой python django
Может ли кто-нибудь объяснить, почему мой код не перенаправляет меня на home.html после успешной регистрации? Я создаю пользовательские формы входа и регистрации. Дайте мне знать, если есть еще код, который вам нужно увидеть.
```
from django.shortcuts import render, redirect
from django.views.generic import TemplateView, CreateView
from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse_lazy
from django.contrib import messages
from .forms import JoinForm
class HomeView(TemplateView):
template_name = "home.html"
class JoinView(TemplateView):
template_name = "registration/join.html"
def join(request):
if request.method == "POST":
form = JoinForm(request.POST or None)
if form.is_vaild():
form.save()
return render(request, 'home')
else:
return render(request, 'join')
class LoginView(TemplateView):
template_name = "login.html"
```
Мои URL
from django.urls import path
from .views import HomeView, LoginView, JoinView
urlpatterns = [
path('', HomeView.as_view(), name="home"),
path('join/', JoinView.as_view(), name="join"),
path('signin', LoginView.as_view(), name="signing"),
]
Models.py
from django.db import models
class Join(models.Model):
fname = models.CharField(max_length=100, blank=True)
lname = models.CharField(max_length=100, blank=True)
email = models.EmailField(max_length=100, blank=True)
age = models.IntegerField()
password1 = models.CharField(max_length=50, blank=True)
def __str__(self):
return (self.fname + " " + self.lname)
form.py
from django import forms
from .models import Join
class JoinForm(forms.ModelForm):
class Meta:
model = Join
fields = ['fname', 'lname', 'email', 'password1', 'age']
join.html
{% extends 'base.html' %}
{% block content %}
<h2>Become a Member</h2>
<form method="POST" action="{% url 'join' %}" \>
{%csrf_token%}
<div class="form-group">
<input type="email" class="form-control" placeholder="Email Address" name="email">
</div>
<div class="form-group">
<input type="text" class="form-control" id="exampleInputPassword1" placeholder="First name:" name="fname">
</div>
<div class="form-group">
<input type="text" class="form-control" id="exampleInputPassword1" placeholder="Last name:" name="lname">
</div>
<div class="form-group">
<input type="text" class="form-control" id="exampleInputPassword1" placeholder="Age:" name="age">
</div>
<div class="form-group">
<input type="Password" class="form-control" id="exampleInputPassword1" placeholder="Password:" name="Password1">
</div>
<button type="submit" class="btn btn-primary">Join!</button>
</form>
{% endblock content %}
Вот мой base.html
<!doctype html>
{% load static %}
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.5.3/dist/css/bootstrap.min.css">
<title>Hello, world!</title>
</head>
<body>
<header>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<a class="navbar-brand" href="{% url "home" %}">Nails</a>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="{% url 'home' %}">Home</a>
</li>
<li class="nav-item active">
<a class="nav-link" href="{% url 'login' %}">Log In</a>
</li>
<li class="nav-item active">
<a class="nav-link" href="{% url 'join' %}">Join</a>
</li>
</ul>
</div>
</nav>
</header>
{% if user.is_authenticated %}
<p>Hi {{ user.username }}!</p>
<p><a href="{% url 'logout' %}">Log Out</a></p>
{% else %}
<p>You are not logged in</p>
{% endif %}
{% block content %}
{% endblock content %}
</body>
</html>
Пожалуйста, дайте мне знать, если я могу еще чем-то помочь.
Вы присоединяетесь к представлению не очень хорошо. render функция принимает запрос, шаблон и контекст в качестве параметров для выполнения рендеринга. Вы пытаетесь передать имя url. Вместо этого используйте redirect.
from django.shortcuts import redirect
def join(request):
if request.method == "POST":
form = JoinForm(request.POST or None)
if form.is_vaild():
form.save()
return redirect('home')
else:
return render(request, 'registration/join.html')
и в ваших урлах:
from .views import HomeView, LoginView, join
urlpatterns = [
path('', HomeView.as_view(), name="home"),
path('join/', join, name="join"),
path('signin', LoginView.as_view(), name="signing"),
]
Не стоит обрабатывать пост запрос в той же функции представления, которую вы использовали для GET рендеринга. В случае если ваша форма не очень хороша, с помощью этого шаблона вы не сможете легко передать ошибки формы в шаблон.
Идея представления, которое можно сделать с помощью django generic view такова:
class JoinView(CreateView):
form = JoinView
success_url = "home"
template_name = "registration/join.html"
# And in your urls
from .views import HomeView, LoginView, JoinView
urlpatterns = [
path('', HomeView.as_view(), name="home"),
path('join/', JoinView.as_view(), name="join"),
path('signin', LoginView.as_view(), name="signing"),
]