Home > Software design >  How to update model fields from views with values from a href/url?
How to update model fields from views with values from a href/url?

Time:02-07

I'm making a events website, I need to show the event history of a user logged in.

Currently I'm only passing Event instance to below template not User instance

So when he clicks on Register for Event button on a certain event with id event.id.

{%for event in events%}
        <div class='card-event'>
                <div style="font-weight: 600; margin-top:5px;font-size: 20px;">{{event.name}}</div>
                <div style="margin:10px 0 5px 0;">{{event.event_desc}}</div>
                <div style="margin:5px 0 10px 0;">Entry Fee: {{event.entry_fee}}</div>
                <a href="{%url 'update-event' value1=user.id value2=event.id%}"><button class='register-button'>Register for Event</button></a>
        </div>
        {%endfor%}

He is redirected to url

path('update-event/<value1>/<value2>/',web_views.update_event,name='update-event')

Then the update_event view where database is updated,and is redirected to a simple stable template my_events.html

def update_event(request,value1,value2):
    user= User.objects.get(id=value1)
    ev=Event.objects.get(id=value2)
    data=Participated(user_id=user,event_id=ev)
    data.save()
    return redirect(request,'webpage/my_events.html')

This is the Participated model

class Participated(models.Model):
    user_id=models.ForeignKey(User,on_delete=models.CASCADE)
    event_id=models.ForeignKey(Event,on_delete=models.PROTECT)

I'm getting an error

Reverse for '<WSGIRequest: GET '/update-event/1/4/'>' not found. '<WSGIRequest: GET '/update-event/1/4/'>' is not a valid view function or pattern name.

So how to insert values to Partcipated model?

Edit: Even after changing the path as below it's not working

path('update-event/<int:value1>/<int:value2>/',web_views.update_event,name='update-event')

Edit2: My complete urls.py(I'm using only the main urls.py for all urls)

from django.contrib import admin
from django.contrib.auth import views as auth_views
from django.urls import path,include
from django.conf import settings
from django.conf.urls.static import static
from webpage import views as web_views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('webpage.urls')),
    path('college/',web_views.college,name='college'),
    path('fest/',web_views.fest,name='fest'),
    path('fest/college/',web_views.fest_college,name='fest-college'),
    path('fest/technical/',web_views.fest_technical,name='fest-technical'),
    path('fest/cultural/',web_views.fest_cultural,name='fest-cultural'),
    path('fest/sports/',web_views.fest_sports,name='fest-sports'),
    path('fest/<value>/',web_views.fest_clg,name='fest-clg'),
    path('event/',web_views.event,name='event'),
    path('event/<value>/',web_views.event_fest,name='event-fest'),
    path('my-events/',web_views.my_events,name='my-events'),
    path('update-event/<int:value1>/<int:value2>/',web_views.update_event,name='update-event'),
    path('register/',web_views.register,name='register'),
    path('login/',auth_views.LoginView.as_view(template_name='webpage/login.html'),name='login'),
    path('logout/',auth_views.LogoutView.as_view(template_name='webpage/logout.html'),name='logout')
]

if settings.DEBUG:
    urlpatterns =static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)

I also added user instance to my event view like this

def event(request):
    cur=request.user
    context={
        'events':Event.objects.all(),
        'user': User.objects.get(id=cur.id)
    }
    return render(request,'webpage/event.html',context)

This is django-project in github https://github.com/GaganKaranth/fests-bangalore/tree/main

CodePudding user response:

The path will try to find patterns that have ints for user_id and event_id if you do this:

# urls.py

urlpatterns = [
    ...
    path('update-event/<int:user_id>/<int:event_id>/',web_views.update_event,name='update-event'),
    ...
]

Then in your view, you can grab those, but they must have the same names you gave them in the url patterns, like this:

# views.py
def update_event(request, user_id, event_id):
    user= User.objects.get(id=user_id)
    ev=Event.objects.get(id=event_id)
    ...

Then your html url anchor tage will pass these two ints, in order:

<a href="{% url 'update-event' user.id event.id %}">
  •  Tags:  
  • Related