Я работаю над приложением django, которое содержит две формы в двух разных шаблонах. В первом виде изображение может быть загружено. Как только изображение загружено, классификатор изображений классифицирует изображение и отображает шаблон со второй формой. Во второй форме заполняется некоторое описание об изображении и отправляется форма. Затем форма сохраняется и может быть просмотрена в другом шаблоне.
urls.py
urlpatterns = [
path('', views.index, name='home'),
path('accounts/', include('django.contrib.auth.urls')),
path('signup/', views.signup, name='signup'),
path('items/', views.item_list, name='item_list'),
path('items/upload/', views.upload_image, name='upload_image'),
path('items/upload/description/', views.upload_item, name='upload_item'),
path('items/<int:pk>/', views.delete_item, name='delete_item'),
path('items/upload/image_classification/', views.image_classification, name='image_classification'),
]
В первой форме после загрузки изображения путь становится items/upload/image_classification/
, и отображается вторая форма, которая в соответствии с urls.py равна path('items/upload/description/', views.upload_item, name='upload_item')
.
Проблема, с которой я сталкиваюсь, заключается в том, что при попытке сохранить вторую форму функция image_classification из views.py запускается, тогда как в идеале должна запускаться функция upload_item . Это приводит к тому, что форма не сохраняется.
Когда я пытаюсь загрузить вторую форму напрямую, без первой формы, путь 'items/upload/description/'
и форма успешно сохраняется.
Что я делаю не так?
Вот остаток кода
views.py
def upload_image(request):
return render(request, 'upload_image.html')
def upload_item(request):
if request.method == 'POST':
form_des = ItemForm(request.POST, request.FILES)
if form_des.is_valid():
form_des.save()
return redirect('item_list')
else:
form_des = ItemForm()
return render(request, 'upload_item.html', {'form_des': form_des})
def handle_uploaded_file(file, filename):
if not os.path.exists('media/classification/'):
os.mkdir('media/classification/')
with open('media/classification/' + filename, 'wb+') as destination:
for chunk in file.chunks():
destination.write(chunk)
def image_classification(request):
form_des = ItemForm()
if request.method == 'POST':
if 'file' in request.FILES:
handle_uploaded_file(request.FILES['file'], str(request.FILES['file']))
img = np.expand_dims(cv2.resize(cv2.imread(os.path.join('./media/classification/', str(request.FILES['file']))), (170, 100)), axis=0)
cat_prediction = cat_classifier.predict_classes(img)[0]
pattern_prediction = pat_classifier.predict_classes(img)[0]
form_des.fields['title'].widget.attrs['value'] = cat_prediction
form_des.fields['pattern'].widget.attrs['value'] = pattern_prediction
return render(request, 'upload_item.html', {'form_des': form_des})
return HttpResponse('failed')
шаблон upload_image.html
{% block content %}
<div class="row justify-content-center">
<div class="col-8">
<center>
<h2>Upload image</h2>
<div class="row justify-content-center">
<div class="upload-btn-wrapper">
<form action="{{ request.build_absolute_uri }}image_classification/" method="POST" enctype="multipart/form-data" class='first_form'>
{% csrf_token %}
<input type="file" name="file" id="file" class="inputfile" />
<label for="file" class="btn btn-outline-warning btn-lg btn-block select mt-5">Choose a file</label>
<input class='btn btn-primary btn-lg btn-block' type="submit" value="Upload image" />
</form>
</div>
</div>
<p class='font-weight-bold mt-5'>Step: 1 of 2</p>
</center>
</div>
</div>
{% endblock content %}
шаблон upload_item.html
{% block content %}
<div class="row justify-content-center">
<div class="col-6">
<center>
<h2>Item description</h2>
</center>
<div class="card mb-5 mt-3">
<div class="card-body">
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{form_des|crispy}}
<button type="submit" class='btn btn-primary btn-lg btn-block save_btn'>Save item</button>
</form>
</div>
</div>
<center><p class='font-weight-bold mt-5'>Step: 2 of 2</p></center>
</div>
</div>
{% endblock content %}
Пожалуйста, помогите мне
Спасибо
PS: Не уверен, что заголовок вопроса имеет отношение к содержанию. Я не мог придумать правильное название для этого вопроса. Извините за то же самое.