1

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 }}">&laquo;</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 }}">&raquo;</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!!!!!!!

hossein
  • 77
  • 6
  • 1
    Can you share your file structure for this project as well? That may help clarify the problem. Also, try using `DEBUG=True` in your `settings.py` if you aren't already. That should give you a more helpful traceback that tells you what url patterns Django tried to use. – James Tollefson Nov 04 '20 at 21:43
  • @JamesTollefson what does your mean about file structure!!!!??? i give this project source code in github and DEBUG=TRUE is in my code can you help me ?? – hossein Nov 05 '20 at 08:11
  • The accepted answer to [this question](https://stackoverflow.com/questions/22841764/best-practice-for-django-project-working-directory-structure) shows what I'm talking about. Just an outline of how everything in your project is arranged. – James Tollefson Nov 05 '20 at 08:13
  • @JamesTollefson i put the structure in my project can you see it??? – hossein Nov 05 '20 at 08:45
  • In your file directory I see you have a directory named `carss` while the templates directory has a directory named `cars`. Is this a typo or do these actually have different names in your project? – James Tollefson Nov 05 '20 at 08:49
  • All right, I think this will be the last thing I ask you for because I'm pretty sure it will be the source of the problem - can you provide the `urls.py` file from the project root? That's the `urls.py` that is directly underneath `auto_maniac`. – James Tollefson Nov 05 '20 at 08:50
  • @JamesTollefson carss is a typo mistake that cars is true and my projects urls.py is ::: urlpatterns = [ path('admin/', admin.site.urls), path('users/', include('users.urls')), path('cars/', include('cars.urls')) ] – hossein Nov 05 '20 at 08:54
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/224162/discussion-between-james-tollefson-and-hossein). – James Tollefson Nov 05 '20 at 16:44
  • I believe the answer to your question can be found in this [community wiki page](https://stackoverflow.com/questions/38390177/what-is-a-noreversematch-error-and-how-do-i-fix-it). You should be able to debug this problem by walking through the steps outlined by the author, – James Tollefson Nov 05 '20 at 17:19

0 Answers0