python - 如何解决 NoReverseMatch Django 2.0
问题描述
我是 Python 和 Django 的新手。我正在从教程中学习它,但介于两者之间。已经尝试过使用其他一些 StackOverflow 解决方案,但没有运气。我收到以下错误
错误:/catalog/ 处的 NoReverseMatch 有人,请帮我解决我犯的错误。
网址.py
urlpatterns += [
path('book/<uuid:pk>/renew/', views.renew_book_librarian, name='renew-book-librarian'),
]
视图.py
@permission_required('catalog.view_all_books')
def renew_book_librarian(request, pk):
"""View function for renewing a specific BookInstance by librarian."""
book_instance = get_object_or_404(BookInstance, pk=pk)
# If this is a POST request then process the Form data
if request.method == 'POST':
# Create a form instance and populate it with data from the request (binding):
book_renewal_form = RenewBookForm(request.POST)
# Check if the form is valid:
if book_renewal_form.is_valid():
# process the data in form.cleaned_data as required (here we just write it to the model due_back field)
book_instance.due_back = book_renewal_form.cleaned_data['renewal_date']
book_instance.save()
# redirect to a new URL:
return HttpResponseRedirect(reverse('all-borrowed'))
# If this is a GET (or any other method) create the default form.
else:
proposed_renewal_date = datetime.date.today() + datetime.timedelta(weeks=3)
book_renewal_form = RenewBookForm(initial={'renewal_date': proposed_renewal_date})
context = {
'form': book_renewal_form,
'book_instance': book_instance,
}
return render(request, 'catalog/book_renew_librarian.html', context)
模型.py
class BookInstance(models.Model):
"""
Model representing a specific copy of a book (i.e. that can be borrowed from the library).
"""
id = models.UUIDField(primary_key=True, default=uuid.uuid4,
help_text="Unique ID for this particular book across whole library")
book = models.ForeignKey('Book', on_delete=models.SET_NULL, null=True)
imprint = models.CharField(max_length=200)
due_back = models.DateField(null=True, blank=True)
borrower = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
@property
def is_overdue(self):
if self.due_back and date.today() > self.due_back:
return True
return False
LOAN_STATUS = (
('d', 'Maintenance'),
('o', 'On loan'),
('a', 'Available'),
('r', 'Reserved'),
)
status = models.CharField(max_length=1, choices=LOAN_STATUS, blank=True, default='d', help_text='Book availability')
class Meta:
ordering = ["due_back"]
permissions = (("view_all_books", "View all books"),)
def __str__(self):
"""
String for representing the Model object.
"""
# return '%s (%s)' % (self.id,self.book.title)
# return '{0} ({1})'.format(self.id, self.book.title)
return self.book.title
表格.py
class RenewBookForm(forms.Form):
renewal_date = forms.DateField(help_text="Enter a date between now and 4 weeks (default 3).")
def clean_renewal_date(self):
data = self.cleaned_data['renewal_date']
# Check if a date is not in the past.
if data < datetime.date.today():
raise ValidationError(_('Invalid date - renewal in past'))
# Check if a date is in the allowed range (+4 weeks from today).
if data > datetime.date.today() + datetime.timedelta(weeks=4):
raise ValidationError(_('Invalid date - renewal more than 4 weeks ahead'))
# Remember to always return the cleaned data.
return data
book_renew_librarian.html
{% extends "base_generic.html" %}
{% block content %}
<h1>Renew: {{ book_instance.book.title }}</h1>
<p>Borrower: {{ book_instance.borrower }}</p>
<p>Book ID: {{ book_instance.id }}</p>
<p {% if book_instance.is_overdue %} class="text-danger"{% endif %}>Due date: {{ book_instance.due_back }}</p>
<form action="" method="post">
{% csrf_token %}
{{ form.as_table }}
<input type="submit" value="Submit">
</form>
{% endblock %}
base_generic.html
{% if perms.catalog.view_all_books %}- <a href="{% url 'renew-book-librarian' book_instance.id %}">Renew</a> {% endif %}
解决方案
推荐阅读
- go - os.FileInfo 中的 Sys() 是什么?
- sql - 寻找更有效的'for循环'sql
- django - “detail”:“JSON 解析错误 - 预期值:第 1 行第 1 列(字符 0)”django rest 框架
- ios - 如何快速将扫描保存到用户的照片库
- php - 有没有办法在php的不同位置包含相同的文件
- flutter - Flutter 中更新 state 对象后 hookwidget 不重新渲染
- python - 如何从函数返回布尔值?
- node.js - 我在 discord.js 中的静音命令不起作用
- google-cloud-dataflow - 数据流 - distinct 卡在 3MB 的数据中并扼杀了吞吐量
- android - 如何解决flutter中的渲染溢出问题?