Reputation: 708
I am new to Django and trying to pass an program code to a view and filter out courses objects based on the program code. here are the codes:
models.py
class Program(models.Model):
class Meta:
verbose_name_plural = 'Program'
program_code = models.CharField(max_length=10,
default='',
validators=[MinLengthValidator(1)])
program_title = models.CharField(max_length=100,
default='',
validators=[MinLengthValidator(10)])
class Courses(models.Model):
class Meta:
verbose_name_plural = 'Courses'
program = models.ManyToManyField(Program, blank=False)
course_code = models.CharField(max_length=10,
default='',
unique=True,
validators=[MinLengthValidator(1)])
course_title = models.CharField(max_length=100,
default='',
validators=[MinLengthValidator(10)])
urls.py:
urlpatterns = [
path('',views.programs,name='programs'),
path('<slug:program_code_no>/',views.courses,name='courses'),
]
views.py
def programs(request):
obj = Program.objects.all()
paginator = Paginator(obj,20)
page = request.GET.get('p', 1)
list = paginator.get_page(page)
all_details={
'lists': list,
}
return render(request,'courses/programs/index.html',context=all_details)
def courses(request,program_code_no):
obj = Courses.objects.filter(program=program_code_no)
paginator = Paginator(obj,20)
page = request.GET.get('p', 1)
list = paginator.get_page(page)
all_details={
'lists': list,
}
return render(request,'courses/courses/index.html',context=all_details)
However, I get this error when I try to get http://127.0.0.1:8000/programs/P132/ ('P132' is a program_code object, already created)
ValueError at /programs/P132/
invalid literal for int() with base 10: 'P132'
Request Method: GET
Request URL: http://127.0.0.1:8000/programs/P132/
Django Version: 2.2.1
Exception Type: ValueError
Exception Value:
invalid literal for int() with base 10: 'P132'
Exception Location: C:\Users\Prabu\Anaconda3\envs\codeforcoder\lib\site-packages\django\db\models\fields\__init__.py in get_prep_value, line 966
Python Executable: C:\Users\Prabu\Anaconda3\envs\codeforcoder\python.exe
Python Version: 3.7.4
Python Path:
['C:\\Users\\Prabu\\Desktop\\Django codeforcoder\\codeforcoder '
'v1.0.1\\codeforcoder',
'C:\\Users\\Prabu\\Anaconda3\\envs\\codeforcoder\\python37.zip',
'C:\\Users\\Prabu\\Anaconda3\\envs\\codeforcoder\\DLLs',
'C:\\Users\\Prabu\\Anaconda3\\envs\\codeforcoder\\lib',
'C:\\Users\\Prabu\\Anaconda3\\envs\\codeforcoder',
'C:\\Users\\Prabu\\Anaconda3\\envs\\codeforcoder\\lib\\site-packages']
Upvotes: 0
Views: 73
Reputation: 476624
You need to filter on the program_code
of the related program
, so:
def courses(request,program_code_no):
obj = Courses.objects.filter(program__program_code=program_code_no)
paginator = Paginator(obj,20)
pagenum = request.GET.get('p', 1)
page = paginator.get_page(pagenum)
all_details={
'lists': page,
}
return render(request,'courses/courses/index.html',context=all_details)
Upvotes: 2