Как получить доступ к уже загруженным файлам Docx в Django для поиска нужных слов? - PullRequest
0 голосов
/ 02 января 2019

Я хочу отредактировать нужный загруженный файл на веб-странице путем поиска и замены нужных слов.Как я могу получить текст этого файла документа?

У меня есть файловое поле в моих моделях, и я получаю файлы документа в списке на моей веб-странице, где я могу удалить нужный файл или загрузить новыйодин.Я пытаюсь отредактировать требуемый загруженный файл документа, создав функцию в моем views.py.Я пытался использовать модуль docx, чтобы открыть загруженный файл, а также пробовал io.StringIO (), но мне не удалось получить желаемый результат.

models.py

class DocFile(models.Model):
    title = models.CharField(max_length=50)
    agreement = models.FileField(upload_to='')

views.py

def edit_file(request, upload_id):
    instance = get_object_or_404(DocFile, id=upload_id)
    content = instance.agreement.open(mode='rb')
    variables = []
    for line in content:
        match = re.findall(r"\{(.*?)\}", line.text)
        variables.append(match)
        return render(request, 'uploads/file_detail.html', {
            'variables': variables
        })

или

def edit_file(request, upload_id):
    instance = get_object_or_404(DocFile, id=upload_id)
    content = instance.agreement(upload_id)
    with open(content, 'rb') as f:
        instance.agreement = File(f)
        source = io.StringIO(f)
        document = Document(source)
        variables = []
        for paragraph in document.paragraphs:
            match = re.findall(r"\{(.*?)\}", paragraph.text)
            variables.append(match)
        for table in document.tables:
            for row in table.rows:
                for cell in row.cells:
                    match = re.findall(r"\{(.*?)\}", cell.text)
                    variables.append(match)
        source.close()
        target = io.StringIO()
        document.save(target)
    return render(request, 'uploads/file_detail.html', {
        'variables': variables
    })

file_detail.html

{% block content %}

    <form method="post">
    {% csrf_token %}
    {% if variables %}
        {% for variable in variables %}
            {% for var in variable %}
                {{ var }} <br /><input type="text", name="statement">
                <br />
                <br />
            {% endfor %}
        {% endfor %}
        <input type="submit" value="Download">
    {% endif %}
    </form>

    <a href="{{ template.agreement }}" class="btn btn-primary btn-sm">
    Edit
    </a>

{% endblock %}

Когда я запускаю первую функцию просмотра, я получаю следующую ошибку:

AttributeError at /template/11/

'bytes' object has no attribute 'text'

И когда я запускаю второй метод функции просмотра, я получаю следующую ошибку:

TypeError at /template/11/

'FieldFile' object is not callable
...