0
votes
#models.py

from django.db import models
from django.utils import timezone
from django.urls import reverse,reverse_lazy,resolve
# Create your models here.

class Purchase(models.Model):
    purchase_date = models.DateField()
    components = models.ForeignKey(Components,on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField()
    remarks = models.TextField(max_length=500,blank=True,null=True)

    def __str__(self):
        return str(self.pk)

#views.py
from django.shortcuts import render
from django.urls import reverse_lazy
from django.views.generic import (View, ListView, DetailView, CreateView, UpdateView, DeleteView)
from myinventory.models import Purchase
# Create your views here.

class PurchaseCreateView(CreateView):
    model = Purchase
    fields = '__all__'
    success_url = reverse_lazy("purchase_form")

def get_context_data(self,**kwargs):
    context = super().get_context_data(**kwargs)
    context['purchases'] = Purchase.objects.all()
    return context

project urls.py
from django.contrib import admin
from django.urls import path,include

urlpatterns = [

    path('admin/', admin.site.urls),
    path('',include('myinventory.urls','myinventory')),

]

app urls.py
from django.urls import path,reverse_lazy
from django.views.generic import CreateView
from myinventory import views


app_name = 'myinventory'

urlpatterns = [
        path('purchase_form/', views.PurchaseCreateView.as_view(),name="purchase_form"),
]


purchase_form.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Purchase</title>
  </head>
  <body>
    <form method="post">
      {% csrf_token %}
      {{ form.as_p }}
      <input type="submit" value="Submit">

      {% for purchase in purchases %}
      <h2>{{ purchase.purchase_date }}</h2>
      <h2>{{ purchase.components }}</h2>
      <h2>{{ purchase.quantity }}</h2>
      <h2>{{ purchase.remarks }}</h2>
      {% endfor %}
    </form>
  </body>
</html>

admin.py
from django.contrib import admin
from myinventory.models import *


# Register your models here.


admin.site.register(Purchase)

Traceback

I'm getting following error:
Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/purchase_form/

Django Version: 3.1.7
Python Version: 3.9.1
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'myinventory']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):

File "C:\Users\Hp\anaconda3\envs\MyRLXEnv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner response = get_response(request) File "C:\Users\Hp\anaconda3\envs\MyRLXEnv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\Hp\anaconda3\envs\MyRLXEnv\lib\site-packages\django\views\generic\base.py", line 70, in view return self.dispatch(request, *args, **kwargs) File "C:\Users\Hp\anaconda3\envs\MyRLXEnv\lib\site-packages\django\views\generic\base.py", line 98, in dispatch return handler(request, *args, **kwargs) File "C:\Users\Hp\anaconda3\envs\MyRLXEnv\lib\site-packages\django\views\generic\edit.py", line 172, in post return super().post(request, *args, **kwargs) File "C:\Users\Hp\anaconda3\envs\MyRLXEnv\lib\site-packages\django\views\generic\edit.py", line 142, in post return self.form_valid(form) File "C:\Users\Hp\anaconda3\envs\MyRLXEnv\lib\site-packages\django\views\generic\edit.py", line 126, in form_valid return super().form_valid(form) File "C:\Users\Hp\anaconda3\envs\MyRLXEnv\lib\site-packages\django\views\generic\edit.py", line 57, in form_valid return HttpResponseRedirect(self.get_success_url()) File "C:\Users\Hp\anaconda3\envs\MyRLXEnv\lib\site-packages\django\views\generic\edit.py", line 11m2, in get_success_url if self.success_url: File "C:\Users\Hp\anaconda3\envs\MyRLXEnv\lib\site-packages\django\utils\functional.py", line 135, in wrapper res = func(*self.__args, **self.__kw) File "C:\Users\Hp\anaconda3\envs\MyRLXEnv\lib\site-packages\django\urls\base.py", line 87, in reverse return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)) File "C:\Users\Hp\anaconda3\envs\MyRLXEnv\lib\site-packages\django\urls\resolvers.py", line 685, in _reverse_with_prefix raise NoReverseMatch(msg)

 Exception Type: NoReverseMatch at /purchase_form/
    Exception Value: Reverse for 'purchase_form' not found. 'purchase_form' is not a valid view function or pattern name.
1

1 Answers

0
votes

When you set app_name in your app's urls.py you namespace your urls, i.e. now whenever you want to reverse your url you should use <app_name>:<url_name>. So in your view PurchaseCreateView instead of:

success_url = reverse_lazy("purchase_form")

You should write:

success_url = reverse_lazy("myinventory:purchase_form")