как изменить путь с помощью рендера - PullRequest
0 голосов
/ 08 января 2019

Я работаю над приложением 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: Не уверен, что заголовок вопроса имеет отношение к содержанию. Я не мог придумать правильное название для этого вопроса. Извините за то же самое.

...