Попытка использовать загрузку файла без forms.py - объект 'InMemoryUploadedFile' не вызывается - PullRequest
1 голос
/ 04 июня 2019

Итак, я пытаюсь создать форму с некоторыми данными и полем загрузки.Django docs не предоставляет хорошего руководства, как делать это без forms.py.Я не хочу использовать это.

Я пытался адаптировать их учебник с forms.py (https://docs.djangoproject.com/en/2.2/topics/http/file-uploads/) с моим проектом, но я получаю ошибку. "Объект InMemoryUploadedFile не вызывается«Я пытался найти его в Google, но я не нашел эту ошибку.

Я явно что-то упустил, потому что когда я использовал для загрузки файлов с Node, мне приходилось делать больше вещей, например, настройку хранилища файлови т.д. Я просто не знаю, как с этим справиться в django. Так чего мне не хватает и почему я получаю эту ошибку?

views.py

def incarcarecv(req):
    context = {
        'title': "title"
    }
    if req.method == 'POST':
        nume = req.POST['nume']
        prenume = req.POST['prenume']
        telefon = req.POST['telefon']
        email = req.POST['email']
        CV = req.FILES['CV']
        cvUpload = CV(solicitant = req.user, nume=nume, prenume=prenume, telefon=telefon, emailContact=email, CV=CV)        
    return render(req, "../templates/pagini/incarcare-cv.html", context)

models.py

class CV(models.Model):
    solicitant = models.ForeignKey(User, on_delete=models.CASCADE)
    dataUploadCV = models.DateField(auto_now_add=True)
    nume = models.CharField(max_length=12)
    prenume = models.CharField(max_length=12)
    telefon = models.CharField(max_length=12)
    emailContact = models.EmailField(max_length=40)
    CV = models.FileField(upload_to='documents/%d/%m/%Y')
    rezolvata = models.BooleanField(default=False)
    def __str__(self):
        return self.solicitant

html

{% extends 'base.html' %}
{% load static %}
{% block content %}
            <div class="container container-centru">
                <h1 class="heading-contact">Incarca CV</h1>
                {% include 'partials/_alerts.html' %}
                <form action="{% url 'incarcarecv' %}" method="POST" class="form-contact"  enctype="multipart/form-data">
                    {% csrf_token %}
                        <div class="form-group">
                            <label for="inputnume" class="email-contact">Nume</label>
                            <input type="text" name="nume" class="form-control" id="inputnume" aria-describedby="emailHelp" placeholder="Introdu nume">
                        </div>
                        <div class="form-group">
                                <label for="inputprenume" class="email-contact">Prenume</label>
                                <input type="text" name="prenume" class="form-control" id="inputprenume" aria-describedby="emailHelp" placeholder="Introdu prenume">
                        </div>
                        <div class="form-group">
                            <label for="inputtelefon" class="email-contact">Telefon</label>
                            <input type="text" name="telefon" class="form-control" id="inputtelefon" aria-describedby="emailHelp" placeholder="Introdu telefon">
                        </div>
                        <div class="form-group">
                            <label for="inputemail" class="email-contact">Email</label>
                            <input type="email" name="email" class="form-control" id="inputemail" aria-describedby="emailHelp" placeholder="Introdu email">
                        </div>
                        <div class="form-group">
                                <label for="inputcv" class="email-contact">CV</label>
                                <input type="file" name="CV" class="form-control" id="inputemail" aria-describedby="emailHelp">
                            </div>
                        <div class="form-group form-group-custom">
                                <input type="submit" value="Trimite" class="btn btn-secondary btn-block btn-login-custom">
                                <input type="submit" value="Resetează câmpurile" class="btn btn-secondary btn-block btn-reset-custom">
                        </div>                   
                </form>
            </div>              
{% endblock %}

Позвольте мне перевести: name = фамилия, prenume = имя, telefon = phone.

Так, как я могу обрабатывать файлы в этомситуации и без использования forms.py? Как я уже сказал, django не предоставляет никакого руководства по этому вопросу.

Спасибо!

1 Ответ

1 голос
/ 04 июня 2019

По вашему мнению, вы shadow модель CV, определив переменную local с именем CV. Действительно, ты пишешь:

    <s>CV</s> = req.FILES['CV']

Таким образом, в этом представлении CV действительно не относится к модели CV, а к файлу, позже вы затем вызываете конструктор модели CV(..), но при этом вызываете вместо этого обработчик файла.

def incarcarecv(req):
    context = {
        'title': 'title'
    }
    if req.method == 'POST':
        nume = req.POST['nume']
        prenume = req.POST['prenume']
        telefon = req.POST['telefon']
        email = req.POST['email']
        <b>cv</b> = req.FILES['CV']
        cv_upload = CV(
            solicitant=req.user,
            nume=nume,
            prenume=prenume,
            telefon=telefon,
            emailContact=email,
        )
        <b>cv_upload.cv.save(cv.name, cv)</b>
        <b>cv_upload.save()</b>
    return render(req, '../templates/pagini/incarcare-cv.html', context)

Вам потребуется cv_upload.save(), поскольку в противном случае вы создаете объект CV, но не сохраняете его в базе данных.

При этом я настоятельно советую вам использовать a Form, здесь похоже, что простого ModelForm будет достаточно. Форма также может проверять вводимые данные и выдавать ошибки, которые вы можете отправить обратно пользователю о том, что отсутствует.

При использовании PEP-8 соглашений об именах также менее вероятно, что такие столкновения имен произойдут.

Вы также должны, в случае успешного запроса POST, перенаправить на страницу. Это Post / Redirect / Get шаблон веб-разработки . В противном случае, если отправка была успешной, если вы отображаете страницу, и пользователь обновляет страницу в браузере, браузер выполнит тот же запрос POST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...