首页 > 解决方案 > django.urls.exceptions.NoReverseMatch

问题描述

我是 Django 的新手。在代码中,“pembekal”是指供应商。当我单击“New stok”按钮时 - 它会创建新书或其他新项目,但它会给出如下错误:

django.urls.exceptions.NoReverseMatch: Reverse for 'stok_create' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['books/(?P<pk>[0-9]+)/create/$']

模型.py

from django.db import models
from django.contrib.auth.models import User

class Pembekal(models.Model):
    pembekal = models.CharField(max_length=50, unique=True)
    alamat = models.CharField(max_length=50)
    telefon = models.CharField(max_length=20)

    def __str__ (self):
        return self.pembekal

class Stok(models.Model):
    stok = models.CharField(max_length=50, unique=True)
    pembekal = models.ForeignKey(Pembekal, on_delete=models.CASCADE, related_name='stoks')

    def __str__ (self):
        return self.jenis_stok

视图.py

from django.shortcuts import render, get_object_or_404
from django.http import JsonResponse
from django.template.loader import render_to_string
from django.urls import reverse
from .models import Pembekal
from .forms import PembekalForm, StokForm

def pembekal_list(request):
    pembekals = Pembekal.objects.all()
    return render(request, 'books/book_list.html', {'pembekals': pembekals})

def stok_list(request, pk):
    pembekal = Pembekal.objects.get(pk=pk)
    return render(request, 'books/stok_list.html', {'pembekal':pembekal})

def save_pembekal_form(request, form, template_name):
    data = dict()
    if request.method == 'POST':
        if form.is_valid():
            form.save()
            data['form_is_valid'] = True
            pembekals = Pembekal.objects.all()
            data['html_book_list'] = render_to_string('books/includes/partial_book_list.html', {'pembekals': pembekals})
        else:
            data['form_is_valid'] = False
    context = {'form': form}
    data['html_form'] = render_to_string(template_name, context, request=request)
    return JsonResponse(data)

def pembekal_create(request):
    if request.method == 'POST':
        form = PembekalForm(request.POST)
    else:
        form = PembekalForm()
    return save_pembekal_form(request, form, 'books/includes/partial_book_create.html')

def save_stok_form(request, form, template_name):
    data = dict()
    if request.method == 'POST':
        if form.is_valid():
            form.save()
            data['form_is_valid'] = True
            stoks = Stok.objects.all()
            data['html_book_list'] = render_to_string('books/includes/partial_stok_list.html', {'stoks': stoks})
        else:
            data['form_is_valid'] = False
    context = {'form': form}
    data['html_form'] = render_to_string(template_name, context, request=request)
    return JsonResponse(data)

def stok_create(request, pk):
    pembekal = get_object_or_404(Pembekal, pk=pk)
    if request.method == 'POST':
        form = StokForm(request.POST, instance=pembekal)
    else:
        form = StokForm(instance=pembekal)
    return save_stok_form(request, form, 'books/includes/partial_stok_create.html')

def pembekal_update(request, pk):
    pembekal = get_object_or_404(Pembekal, pk=pk)
    if request.method == 'POST':
        form = PembekalForm(request.POST, instance=pembekal)
    else:
        form = PembekalForm(instance=pembekal)
    return save_pembekal_form(request, form, 'books/includes/partial_book_update.html')

def pembekal_delete(request, pk):
    pembekal = get_object_or_404(Pembekal, pk=pk)
    data = dict()
    if request.method == 'POST':
        pembekal.delete()
        data['form_is_valid'] = True
        pembekals = Pembekal.objects.all()
        data['html_book_list'] = render_to_string('books/includes/partial_book_list.html',
        {'pembekals': pembekals})
    else:
        context = {'pembekal': pembekal}
        data['html_form'] = render_to_string('books/includes/partial_book_delete.html',
        context, request=request)
    return JsonResponse(data)

表格.py

from django import forms

from .models import Pembekal, Stok


class PembekalForm(forms.ModelForm):
    class Meta:
        model = Pembekal
        fields = ('pembekal', 'alamat', 'telefon',)

class StokForm(forms.ModelForm):
    class Meta:
        model = Stok
        fields = ('stok',)

网址.py

    urlpatterns = [
        path('', TemplateView.as_view(template_name='home.html'), name='home'),
        path('books/', views.pembekal_list, name='book_list'),
        path('books/create/', views.pembekal_create, name='book_create'),
        path('books/<int:pk>/', views.stok_list, name='stok_list'),
        path('books/<int:pk>/update/', views.pembekal_update, name='book_update'),
        path('books/<int:pk>/delete/', views.pembekal_delete, name='book_delete'),
        path('books/<int:pk>/create/', views.stok_create, name='stok_create'),
        path('admin/', admin.site.urls),
]

stok_list.html

{% extends 'base.html' %}

{% load static %}

{% block javascript %}
  <script src="{% static 'books/js/books.js' %}"></script>
{% endblock %}

{% block content %}        
  <div class="container">
    <ol class="breadcrumb my-4">
      <li class="breadcrumb-item"><a href="{% url 'book_list' %}">Pembekals</a></li>
      <li class="breadcrumb-item active">{{ pembekal.pembekal }}</li>
    </ol>
  </div>

  <p>
    <button type="button" class="btn btn-primary js-create-book" data-url="{% url 'stok_create' pk=pembekal.pk %}">
      <span class="glyphicon glyphicon-plus"></span>
      New stok
    </button>
  </p>

  <table class="table" id="book-table">
    <thead>
      <tr>
        <th>#</th>
        <th>Stok</th>
        <th></th>
      </tr>
    </thead>
    <tbody>
      {% include 'books/includes/partial_stok_list.html' %}
    </tbody>
  </table>

  <div class="modal fade" id="modal-book">
    <div class="modal-dialog">
      <div class="modal-content">

      </div>
    </div>
  </div>
{% endblock %}

partial_stok_create.html

<form method="post" action="{% url 'stok_create' pk=pembekal.pk %}" class="js-book-create-form">
  {% csrf_token %}
  <div class="modal-header">
    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
      <span aria-hidden="true">&times;</span>
    </button>
    <h4 class="modal-title">Create a new stok</h4>
  </div>
  <div class="modal-body">
    {% include 'books/includes/partial_stok_form.html' %}
  </div>
  <div class="modal-footer">
    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
    <button type="submit" class="btn btn-primary">Create stok</button>
  </div>
</form>

partial_stok_form.html

{% load widget_tweaks %}

{% for field in form %}
  <div class="form-group{% if field.errors %} has-error{% endif %}">
    <label for="{{ field.id_for_label }}">{{ field.label }}</label>
    {% render_field field class="form-control" %}
    {% for error in field.errors %}
      <p class="help-block">{{ error }}</p>
    {% endfor %}
  </div>
{% endfor %}

partial_stok_list.html

{% for stok in pembekal.stoks.all %}
  <tr>
    <td>{{ stok.id }}</td>
    <td><a href="#">{{ stok.stok }}</a></td>
    <td style="width: 150px">
      <button type="button"
              class="btn btn-warning btn-sm js-update-book"
              data-url="#">
        <span class="glyphicon glyphicon-pencil"></span> Edit
      </button>
      <button type="button"
              class="btn btn-danger btn-sm js-delete-book"
              data-url="#">
        <span class="glyphicon glyphicon-trash"></span> Delete
      </button>
    </td>
  </tr>
{% empty %}
  <tr>
    <td colspan="8" class="text-center bg-warning">No book</td>
  </tr>
{% endfor %}

这就是我目前使用的所有文件。非常感谢任何帮助。我正在使用 Ajax 渲染到 CRUD 应用程序。由于上述消息,不会弹出模态表单。多个文件可能有错误。请纠正我。谢谢

标签: pythondjango

解决方案


推荐阅读