I am trying to update my ActiveMember model which has a OneToOneField with Members. I am running into this error.
Reverse for 'update' with keyword arguments '{'id': ''}' not found. 1 pattern(s) tried: ['update/(?P<id>[0-9]+)/\\Z']
I am new to django and not sure how to solve it.
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 %}
Also, I am trying to make a gym management system where I can add new members and activate their membership, and view active member and inactive members (see photo below for what I currently have). I would love some input if I am heading in the right direction. After, I can solve my current problem. I would like to tackle a big obstacle. I would like the members after their membership expires the date is over their status changes to inactive (automatically) so I can view them in the inactive section.
