Reverse for 'update' with keyword arguments '{'id': ''}' not found. 1 pattern(s) tried: ['update/(?P<id>[0-9]+)/\\Z']

Viewed 101

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.

Current Website

1 Answers

I was referencing Member model instead of ActiveMember hopefully this will help someone.

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,
        })
Related