i am new in django . i work on a project. i use crispy-form in my project.
it is my users views ::
from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm, PasswordChangeForm
from django.contrib.auth import login, authenticate
from django.views.generic import CreateView
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
class RegisterUser(CreateView):
form_class = UserCreationForm
template_name = 'users/register-user'
def get(self, request, *args, **kwargs):
return render(request, 'users/register-user.html', {'form': UserCreationForm()})
def post(self, request, *args, **kwargs):
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=password)
login(request, user)
messages.success(request, f'Welcome, {username}!')
return redirect('cars')
return render(request, 'users/register-user.html', {'form': form})
class ChangePassword(LoginRequiredMixin, CreateView):
form_class = PasswordChangeForm
template_name = 'users/change-password'
def get(self, request, *args, **kwargs):
form = PasswordChangeForm(request.user)
return render(request, 'users/change-password.html', {'form': form})
def post(self, request, *args, **kwargs):
form = PasswordChangeForm(request.user, request.POST)
if form.is_valid():
user = form.save()
update_session_auth_hash(request, user)
messages.success(request, 'Password changed!')
return redirect('cars')
return render(request, 'users/change-password.html', {'form': form})
it is my users urls::
from django.urls import path
from users import views as users_views
from django.contrib.auth import views as auth_views
urlpatterns = [
path('', users_views.RegisterUser.as_view(), name='register_user'),
path('change-password', users_views.ChangePassword.as_view(), name='change_password'),
path('login', auth_views.LoginView.as_view(template_name='users/login.html'), name = 'login'),
path('logout', auth_views.LogoutView.as_view(template_name='users/logout.html'),name='logout'),
]
it is my car views ::
from .models import Car, Repair
from django.views.generic import ListView, UpdateView, DeleteView, CreateView
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.urls import reverse_lazy
from django.contrib import messages
class CarsListView(LoginRequiredMixin, ListView):
model = Car
template_name = 'cars/cars.html'
context_object_name = 'cars'
paginate_by = 10
def get_queryset(self):
if self.request.GET.get('q'):
q = self.request.GET.get('q')
make_results = self.model.objects.filter(
user=self.request.user, make=q).order_by('-pk')
model_results = self.model.objects.filter(
user=self.request.user, model=q).order_by('-pk')
if make_results.exists():
return make_results
elif model_results.exists():
return model_results
else:
return self.model.objects.none()
return self.model.objects.filter(user=self.request.user).order_by('-pk')
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['q'] = self.request.GET.get('q', '')
return context
class AddCarView(LoginRequiredMixin, CreateView):
model = Car
fields = ['make', 'model', 'vrn', 'year']
success_url = '/'
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
class DeleteCarView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
model = Car
success_url = '/'
def test_func(self):
if self.get_object().user == self.request.user:
return True
return False
def delete(self, request, *args, **kwargs):
success_message = f'Car {self.get_object()} has been deleted'
messages.success(self.request, success_message)
return super().delete(request, *args, **kwargs)
class UpdateCarView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Car
fields = ['make', 'model', 'vrn', 'year']
success_message = 'Car info has been updated'
def get_success_url(self, **kwargs):
row = self.request.GET.get('row')
p = self.request.GET.get('p')
q = self.request.GET.get('q')
options = '?p=' + p + '&row=' + row
options += '&q=' + q
messages.success(self.request, self.success_message)
return reverse_lazy('car_detail') + options
def test_func(self):
if self.get_object().user == self.request.user:
return True
return False
class AddRepairView(LoginRequiredMixin, CreateView):
model = Repair
fields = ['date', 'description']
success_message = 'New repair has been added'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['car'] = Car.objects.get(id=self.kwargs['pk'])
return context
def form_valid(self, form, **kwargs):
form.instance.car = Car.objects.get(id=self.kwargs['pk'])
return super().form_valid(form)
def get_success_url(self, **kwargs):
row = self.request.GET.get('row')
p = self.request.GET.get('p')
q = self.request.GET.get('q')
options = '?p=' + p + '&row=' + row
options += '&q=' + q
return reverse_lazy('car_detail') + options
class RepairsListView(LoginRequiredMixin, ListView):
model = Repair
paginate_by = 10
def __get_car(self):
cars = Car.objects.filter(user=self.request.user).order_by('-pk')
if self.request.GET.get('q'):
q = self.request.GET.get('q')
make_results = Car.objects.filter(
user=self.request.user, make=q).order_by('-pk')
model_results = Car.objects.filter(
user=self.request.user, model=q).order_by('-pk')
if make_results.exists():
cars = make_results
elif model_results.exists():
cars = model_results
id = int(self.request.GET.get('row')) - 1
page = int(self.request.GET.get('p')) - 1
id = id + page * 10
return cars[id]
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['car'] = self.__get_car()
context['row'] = self.request.GET.get('row')
context['p'] = self.request.GET.get('p')
context['q'] = self.request.GET.get('q')
return context
def get_queryset(self, **kwargs):
return self.model.objects.filter(car=self.__get_car()).order_by('-pk')
it is my car models ::
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
from django.core.validators import MaxValueValidator, MinValueValidator
class Car(models.Model):
make = models.CharField(max_length=10)
model = models.CharField(max_length=10)
vrn = models.CharField(max_length=10)
year = models.IntegerField(default=timezone.now().year,
validators=[MinValueValidator(timezone.now().year - 100),
MaxValueValidator(timezone.now().year)])
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return f'{self.make} {self.model}'
class Repair(models.Model):
date = models.DateField(default=timezone.now)
description = models.TextField()
car = models.ForeignKey(Car, on_delete=models.CASCADE)
def __str__(self):
lead = self.description[:10] + '...'
return lead
and it is my car urls ::
from django.urls import path
from . import views
urlpatterns = [
path('/', views.CarsListView.as_view(), name='cars'),
path('add-car/', views.AddCarView.as_view(), name='add_car'),
path('car/', views.RepairsListView.as_view(), name='car_detail'),
path('car/<int:pk>/update/', views.UpdateCarView.as_view(), name='update_car'),
path('car/<int:pk>/delete/', views.DeleteCarView.as_view(), name='delete_car'),
path('car/<int:pk>/new-repair/', views.AddRepairView.as_view(), name='add_repair'),
]
it is my base.html ::
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<link rel="stylesheet" href="https://unpkg.com/bootstrap-table@1.16.0/dist/bootstrap-table.min.css">
<title>Auto Maniac</title>
</head>
<body class="pt-5">
<nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
<a class="navbar-brand" href="{% url 'admin:index' %}">AutoManiac</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsExampleDefault" aria-controls="navbarsExampleDefault" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarsExampleDefault">
<ul class="navbar-nav mr-auto">
</li> -->
<li class="nav-item active ml-2">
<a class="nav-link text-light" href="{% url 'cars' %}">Cars</a>
</li>
<li class="nav-item">
<a class="nav-link text-light ml-2" href="{% url 'add_car' %}">Add Car</a>
</li>
{% if '/car' in request.path %}
<div class="nav-item dropdown justify-content-end mr-3">
<a class="nav-link dropdown-toggle text-light ml-2" href="http://example.com" id="dropdown02" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{{ car.make }} {{ car.model }}</a>
<div class="dropdown-menu" aria-labelledby="dropdown01">
<a class="dropdown-item" href="{% url 'add_repair' car.id %}?row={{ row }}&p={{ p }}&q={{ q }}">Add repair</a>
<a class="dropdown-item" href="{% url 'update_car' car.id %}?row={{ row }}&p={{ p }}&q={{ q }}">Update car info</a>
<a class="dropdown-item" href="{% url 'delete_car' car.id %}">Delete car</a>
</div>
</div>
</li>
{% endif %}
</ul>
{% if user.is_authenticated %}
<div class="nav-item dropdown justify-content-end mr-3">
<a class="nav-link dropdown-toggle text-light" href="http://example.com" id="dropdown01" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{{ user.get_username }}</a>
<div class="dropdown-menu" aria-labelledby="dropdown01">
<a class="dropdown-item" href="{% url 'change_password' %}">Password</a>
<a class="dropdown-item" href="{% url 'logout' %}">Logout</a>
</div>
</div>
{% endif %}
<form class="form-inline my-2 my-lg-0" action="{% url 'cars' %}">
<input class="form-control mr-sm-2" type="text" placeholder="Search" name="q" aria-label="Search">
<button class="btn btn-secondary my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</nav>
<div class="container pt-3">
{% if messages %}
{% for message in messages %}
<div class="alert alert-{{ message.tags }}">{{ message }}</div>
{% endfor %}
{% endif %}
{% block content %}
{% endblock %}
</div>
{% if is_paginated %}
<nav aria-label="Page navigation example">
<ul class="pagination justify-content-end et">
{% if page_obj.has_previous %}
<li class="page-item"><a class="page-link" href="?page={{ page_obj.previous_page_number }}&p={{ p }}&row={{ row }}&q={{ q }}">«</a></li>
{% else %}
<li class="page-item"><a class="page-link">Prev</a></li>
{% endif %}
{% if '/car' in request.path %}
{% for i in paginator.page_range %}
{% if page_obj.number == i %}
<li class="page-item active"><a class="page-link active" href="?page={{ i }}&p={{ p }}&row={{ row }}&q={{ q }}">{{ i }}</a></li>
{% else %}
<li class="page-item"><a class="page-link" href="?page={{ i }}&p={{ p }}&row={{ row }}&q={{ q }}">{{ i }}</a></li>
{% endif %}
{% endfor %}
{% else%}
{% for i in paginator.page_range %}
{% if page_obj.number == i %}
<li class="page-item active"><a class="page-link active" href="?page={{ i }}&q={{ q }}">{{ i }}</a></li>
{% else %}
<li class="page-item"><a class="page-link" href="?page={{ i }}&q={{ q }}">{{ i }}</a></li>
{% endif %}
{% endfor %}
{% endif %}
{% if page_obj.has_next %}
<li class="page-item"><a class="page-link" href="?page={{ page_obj.next_page_number }}&p={{ p }}&row={{ row }}&q={{ q }}">»</a></li>
{% else %}
<li class="page-item"><a class="page-link">Next</a></li>
{% endif %}
</ul>
</nav>
{% endif %}
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
<script src="https://unpkg.com/bootstrap-table@1.16.0/dist/bootstrap-table.min.js"></script>
<script>
$(function() {
$('#carsTable').bootstrapTable({
onClickRow: function (row, $element, field) {
window.open("{% url 'car_detail' %}" + "?p={{ page_obj.number }}&row="
+ JSON.parse(row[0]) + "&q={{ q }}", "_top")
}
});
});
</script>
</body>
</html>
and its my project structure::
auto_maniac/
__init__.py
settings.py
settings_dev.py
settings_production.py
urls.py
wsgi.py
users/ # Application
core/
migrations/
__init__.py
templates/ # Application templates
users/
login.html
logout.html
change-password.html
register-user.html
__init__.py
admin.py
apps.py
forms.py
models.py
models_foo.py
models_bar.py
views.py
cars/ # Application
core/
migrations/
__init__.py
templates/ # Application templates
cars/
base.html
cars.html
car_form.html
car_update.html
car_confirm_delete.html
repair_form.html
repair_list.html
__init__.py
admin.py
apps.py
forms.py
models.py
models_foo.py
models_bar.py
views.py
db.sqlite3
manage.py
i can see just register-users.html and change-password.html when change the address to any other html page i have error:: page not found (404).
and when i want to go to cars page have this error:: ((NoReverseMatch at /cars/)) in my base.html code in line :: ((href="{% url 'add_repair' car.id %}?row={{ row }}&p={{ p }}&q={{ q }}">Add repair</a>
))
please help me???!!! noone help me!!!!!!!