Действие формы не вызывает нужную функцию из views.py в Django
Я новичок в Django и делаю свой первый проект на нем. Я сделал форму в файле index.html, эта форма принимала изображение и отправляла его в функцию predictImage в файле views.py. Функция predictImage применяла модель YOLO к изображению и возвращала изображение с метками на ту же index.html страницу.
Это работало нормально, и я получал требуемые результаты. После нажатия кнопки отправки я получал перенаправление на index.html/predictImage, где показывались результаты. (У меня в index.html были добавлены условия для показа результатов)
Затем я решил добавить модель Users и сделал для себя страницу Login, пользователь должен был войти в систему, прежде чем он сможет загрузить изображение. Для этого я также добавил сессии.
Теперь я создал модель Photo, чтобы хранить каждую фотографию, которую загружает каждый пользователь. Все это было успешно сделано, но теперь, когда я попытался сделать то же самое снова, т.е. загрузить изображение и отправить его, это не сработало, и вместо этого перенаправило меня на index.html
Я попытался отладить это, и обнаружил, что я даже не перехожу к views.predictImage при нажатии на кнопку submit. Я не могу понять, почему это происходит, хотя единственными двумя новыми вещами, которые я добавил в index.html, были скрытый входной файл (для получения значения имени пользователя из сессии) и кнопка Logout для выхода из сессии.
Вот мой файл models.py (позже я добавил фотомодель)
from django.db import models
import datetime
import os
# Create your models here.
class Users(models.Model):
username = models.CharField('User Name', null=False, max_length = 50)
password = models.CharField('User Password', max_length=50)
def __str__(self):
return self.username
def filepath(request, filename):
old_filename = filename
timeNow = datetime.datetime.now().strftime('%Y%m%d%H:%M:%S')
filename = "%s%s" % (timeNow, old_filename)
return os.path.join('uploads/', filename)
class Photo(models.Model):
id = models.AutoField(primary_key=True)
image = models.ImageField(upload_to=filepath)
uploader = models.ForeignKey(Users, default=None, on_delete=models.CASCADE)
Это мой файл urls.py, в него не было внесено никаких изменений.
from django.contrib import admin
from django.urls import path, re_path
from firstApp import views
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
re_path('admin/', admin.site.urls),
re_path('index', views.index, name = 'index'),
re_path('login', views.login, name='login'),
re_path('logout', views.logout, name='logout'),
re_path('', views.login, name="Login"),
# re_path('', views.login_submit, name='Home'),
re_path('predictImage', views.predictImage, name='predictImage'),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Это мой views.py файл
@csrf_exempt
def login(request):
if request.session.has_key('is_logged'):
return redirect('index')
if request.POST:
if 'user_name' not in request.POST:
return render(request, 'login.html')
username_entry = request.POST['user_name']
password = request.POST['password']
count = Users.objects.filter(username=username_entry).count()
if count > 0:
user_password = Users.objects.values('password').filter(username=username_entry)[0]
if password == user_password['password']:
request.session['is_logged'] = True
request.session['user_id'] = request.POST['user_name']
return redirect('index')
else:
messages.error(request, "Invalid Password")
return render(request, 'login.html')
else:
messages.error(request, "Invalid Username")
return render(request, 'login.html')
else:
return render(request, 'login.html')
def index(request):
if request.session.has_key('is_logged'):
current_user_id= request.session['user_id']
return render(request, 'index.html', {'ID':current_user_id})
else:
return redirect('login')
# context = {'a':1}
# return render(request, 'index.html', context)
def predictImage(request):
username = request.POST.get('username')
print("HEREEEE: ", username) # was using to check if this function is being called or not
# All the below lines are irrelevant to the bug
# They are only saving the Image file and calling YOLO Model Function to get Resultant image
# All of this was worknig before as well
fileObj = request.FILES['filePath']
fs = FileSystemStorage()
filePathName = fs.save(fileObj.name, fileObj)
filePathName = fs.url(filePathName)
testimage = '.'+filePathName
img_result, resultant_array, total_objects = detect_image(testimage)
cv2.imwrite("media/results/" + fileObj.name, img=img_result)
context = {'filePathName':"media/results/"+fileObj.name, 'predictedLabel': list(resultant_array.keys()), 'values': list(resultant_array.values()), 'total_objects': total_objects}
#context = {}
return render(request, 'index.html', context)
def logout(request):
del request.session['is_logged']
return redirect('login')
А это мой index.html файл (содержит только ту часть, где существует форма, я могу поделиться остальной частью файла, если нужно, но это не связано с этой проблемой, насколько я знаю)
{% csrf_token %}
<div id="content">
<!-- Topbar -->
<nav class="navbar navbar-expand-lg navbar-light bg-light m-5 mx-5 justify-content-center">
<!-- Sidebar Toggle (Topbar) -->
<button id="sidebarToggleTop" class="btn btn-link d-md-none rounded-circle mr-3">
<i class="fa fa-bars"></i>
</button>
<!-- Topbar Search -->
<div class=" mx-5 font-weight-bold">
Uplaod Image
</div>
<input class=" " type="file" name="filePath">
<input hidden class = "" name="username" value="{{ ID }}">
<input type="submit" class="btn-lg btn-success" value="Submit">
<!-- Topbar Navbar -->
</form>
<a class="btn-lg btn-danger" href={% url 'logout' %}> Logout</a>
</nav>
<!-- End of Topbar -->