Реверс для 'update' с ключевыми аргументами '{'id': ''}'' не найден. Проверен 1 шаблон(ы): ['update/(?P<id>[0-9]+)/\\Z']
Я пытаюсь обновить модель ActiveMember, которая имеет поле OneToOneField с членами. Я сталкиваюсь с этой ошибкой.
Reverse for 'update' with keyword arguments '{'id': ''}' not found. 1 pattern(s) tried: ['update/(?P<id>[0-9]+)/\\Z']
Я новичок в django и не уверен, как решить эту проблему.
forms.py
from dataclasses import fields
from random import choices
from socket import fromshare
from django import forms
from django.forms import ModelForm, DateField, widgets
from .models import Member, ActiveMember
from datetime import datetime, timedelta
class MemberForm(ModelForm):
class Meta:
model = Member
fields = (
'full_name',
'email',
'phone',
'image',
'date_created',
)
def __init__(self, *args, **kwargs):
super(MemberForm, self).__init__(*args, **kwargs)
self.fields['image'].required = False
self.fields['email'].required = False
self.fields['date_created'].disabled = True
class ActiveMemberForm(ModelForm):
class Meta:
model = ActiveMember
fields = (
'member',
'start_date',
'end_date',
'status',
)
widgets = {
'start_date': widgets.DateInput(attrs={'type': 'date'}),
'end_date': widgets.DateInput(attrs={'type': 'date'}),
}
models.py
from django.db.models.signals import pre_save
from django.dispatch import receiver
import os
from django.db import models
from django.utils import timezone
from datetime import datetime, timedelta
from django.utils.text import slugify
from .helper import upload_to_image_post
# Create your models here.
def default_start_time():
#now = datetime.now()
now = timezone.now()
start = now.replace(hour=23, minute=59, second=0, microsecond=0)
return start if start > now else start + timedelta(days=1)
class Something(models.Model): timestamp = models.DateTimeField(default=default_start_time)
class Member(models.Model):
full_name = models.CharField(max_length=125)
email = models.EmailField(max_length=125, blank=True, null=True)
phone = models.CharField(max_length=20)
image = models.ImageField(max_length= 256, upload_to=upload_to_image_post, null=True, blank=True)
date_created = models.DateTimeField(default=timezone.now())
class Meta:
verbose_name_plural = "All Members"
def __str__(self):
return str(f"{self.full_name}")
class ActiveMember(models.Model):
member = models.OneToOneField(Member, on_delete=models.CASCADE, related_name='is_member')
start_date = models.DateField(default=timezone.now())
end_date = models.DateTimeField(default=default_start_time)
status = models.CharField(max_length=2, choices=(('1','Active'), ('2','Inactive')), default = '0', blank=True, null=True)
def __str__(self):
return str(f"{self.member}")
views.py
def update(request, id): #this function is called when update data
member = Member.objects.get(pk=id)
form = ActiveMemberForm(request.POST, instance=member)
if form.is_valid():
# the `form.save` will also update your newest image & path.
form.save()
return render(request, 'members/update.html', {
'form': form,
'success': True
})
else:
member = Member.objects.get(pk=id)
form = ActiveMemberForm(instance=member)
return render(request, 'members/update.html', {
'form': form
})
urls.py
from django.urls import path
from . import views
app_name = 'members'
urlpatterns = [
path('', views.index, name='index'),
path('<int:id>', views.view_member, name='view_member'),
path('add/', views.add, name='add'),
path('edit/<int:id>/', views.edit, name='edit'),
path('delete/<int:id>/', views.delete, name='delete'),
path('active/', views.active, name='active'),
path('inactive/', views.inactive, name='inactive'),
path('activate/', views.activate, name='activate'),
path('update/<int:id>/', views.update, name='update'),
]
update.html
{% extends 'members/layout.html' %}
{% block body %}
<h3 class="text-center m-4">Update Membership</h3>
{% if success %}
<div class="alert alert-success" role="alert">
The Membership has been updated successfully.
<a href="{% url 'members:index' %}" class="alert-link">Go to Home Page.</a>
</div>
{% else %}
<div class="row justify-content-center">
<div class="col-6">
<div class="card bg-light mb-3">
<div class="card-header">
<i class="fa-solid fa-pen-to-square fa-lg"></i> Update Membership
</div>
<div class="card-body">
<form action="{% url 'members:update' id=member.id %}" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-primary">Update</button>
<a href="{% url 'members:index' %}" class="btn btn-secondary">Cancel</a>
</form>
</div>
</div>
</div>
</div>
{% endif %}
{% endblock %}
Кроме того, я пытаюсь сделать систему управления тренажерным залом, где я могу добавлять новых членов и активировать их членство, а также просматривать активных и неактивных членов (см. фото ниже для того, что у меня есть сейчас). Мне бы хотелось получить некоторые рекомендации, если я двигаюсь в правильном направлении. После этого я смогу решить свою текущую проблему. Я хотел бы преодолеть большое препятствие. Я бы хотел, чтобы после истечения срока членства статус членов менялся на неактивный (автоматически), чтобы я мог видеть их в разделе неактивных членов.
Я ссылался на модель Member вместо ActiveMember, надеюсь, это кому-нибудь поможет.
def update(request, id):
member = ActiveMember.objects.get(pk=id)
if request.method == 'POST':
form = ActiveMemberForm(request.POST, instance=member)
if form.is_valid():
# update the existing `Band` in the database
form.save()
# redirect to the detail page of the `Band` we just updated
return render(request, 'members/update.html', {
'form': form,
'success': True,
})
else:
form = ActiveMemberForm(instance=member)
return render(request, 'members/update.html', {
'form': form,
'member': member,
})