I am new to Django but I am creating a Realtor application, I would like the user to be able to update their details using CRUD functionality in the UI.
But I can't get my request to work:
Heres is my code (views.py):
from django.shortcuts import render, redirect
from django.contrib import messages, auth
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from contacts.models import Contact
def register(request):
if request.method == 'POST':
# Get form values
first_name = request.POST['first_name']
last_name = request.POST['last_name']
username = request.POST['username']
email = request.POST['email']
password = request.POST['password']
password2 = request.POST['password2']
# Check if passwords match
if password == password2:
# Check username
if User.objects.filter(username=username).exists():
messages.error(request, 'That username is taken')
return redirect('register')
else:
if User.objects.filter(email=email).exists():
messages.error(request, 'That email is being used')
return redirect('register')
else:
# Looks good
user = User.objects.create_user(
username=username, password=password, email=email, first_name=first_name, last_name=last_name) # noqa
# Login after register
auth.login(request, user)
messages.success(request, 'You are now logged in')
return redirect('index')
# user.save()
# messages.success(
# request, 'You are now registered and can log in')
# return redirect('login')
else:
messages.error(request, 'Passwords do not match')
return redirect('register')
else:
return render(request, 'accounts/register.html')
def login(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = auth.authenticate(username=username, password=password)
if user is not None:
auth.login(request, user)
messages.success(request, 'You are now logged in')
return redirect('dashboard')
else:
messages.error(request, 'Invalid credentials')
return redirect('login')
else:
return render(request, 'accounts/login.html')
def logout(request):
if request.method == 'POST':
auth.logout(request)
messages.success(request, 'You are now logged out')
return redirect('index')
@login_required(login_url='login')
def dashboard(request):
user_contacts = Contact.objects.order_by(
'-contact_date').filter(user_id=request.user.id)
context = {
'contacts': user_contacts
}
return render(request, 'accounts/dashboard.html', context)
Then here is (urls.py)
from django.urls import path
from . import views
urlpatterns = [
path('register', views.register, name='register'),
path('login', views.login, name='login'),
path('logout', views.logout, name='logout'),
path('dashboard', views.dashboard, name='dashboard'),
path('edit_profile', views.edit_profile, name='edit_profile'),
]
Lastly, here is my code snippet from the requested link in the html file:
{% extends 'base.html' %}
{% block title %} | Dashboard {% endblock %}
{% block content %}
<section id="showcase-inner" >
<div >
<div >
<div >
<h1 >User Dashboard</h1>
<p >Manage your BT Real Estate account</p>
</div>
</div>
</div>
</section>
<!-- Breadcrumb -->
<section id="bc" >
<div >
<nav aria-label="breadcrumb">
<ol >
<li >
<a href="{% url 'index' %}">
<i ></i> Home
</a>
</li>
<li > Dashboard</li>
</ol>
</nav>
</div>
</section>
{% comment %} Alerts {% endcomment %}
{% include 'partials/__alerts.html' %}
<section id="dashboard" >
<div >
<div >
<div >
<h2>Welcome {{ user.first_name }}
<a href="{% url 'edit_profile' %}">
Edit Profile
</a>
</h2>
</i>
{% if contacts %}
<p>Here are the property listings that you have inquired about</p>
<table >
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">Property</th>
<th></th>
</tr>
</thead>
<tbody>
{% for contact in contacts %}
<tr id="listing">
<td>{{ contact.id }}</td>
<td>{{ contact.listing }}</td>
<td>
<a href="{% url 'listing' contact.listing_id %}">View Listing</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>You have not made any inquiries</p>
{% endif %}
</div>
</div>
</div>
</section>
Please, any help would be really appreciated, also Have i included all my files correctly?
Thank you so much
CodePudding user response:
To answer your latest question, you have to create a new view:
from django.contrib.auth.decorators import login_required
@login_required(login_url='login')
def updateUser(request, pk):
user=User.objects.get(id=pk)
if request.user != user.logged_in:
return HttpResponse('Your are not allowed here!!')
if request.method == 'POST':
...
user.name=request.GET['name']
user.email_address=request.GET['email_address']
user.save()
return redirect('home')
context = {'user':user}
return render(request, 'user.html', context)
Although its not related to your question, I may suggest you use form built-in library from Django. Likewise
def registerPage(request):
form = MyUserCreationForm()
if request.method == 'POST':
form = MyUserCreationForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.username = user.username.lower()
user.save()
login(request, user)
return redirect('home')
....
return render(...)
create a new file, forms.py, create a new form:
from django.contrib.auth.forms import UserCreationForm
class MyUserCreationForm(UserCreationForm):
class Meta:
model = User
fields = ['name', 'username', 'email', 'password1', 'password2']
in the html template:
<form action="/your-name/" method="post">
<label for="your_name">Your name: </label>
<input id="your_name" type="text" name="your_name" ">
...
...
<input type="submit" value="OK">
</form>