在我的django项目中,我试图从现有文件中生成一个新的编辑文件,因此当我编辑文件并将其保存到名为FileField的新模型时,它在/ my_blanks / 2上显示 AttributeError / 'str'对象没有属性'get'。我需要将编辑后的文档及其名称保存或分配到Model.forms中,以便以后可以处理(下载,删除),请您能帮我吗?
要解决我的任务,我使用DocEdited模型,然后将其传递给Forms.py
models.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
from django.core.files.storage import FileSystemStorage
from my_pdf.settings import PRIVATE_STORAGE_ROOT
# Create your models here.
from blanks.validators import validate_file_extension
class DocFile(models.Model):
description = models.CharField(max_length=255, blank=True)
document = models.FileField(upload_to='documents/', validators=[validate_file_extension])
# uploaded_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.description
def delete(self, *args, **kwargs):
self.document.delete()
super().delete(*args, **kwargs)
class DocFields(models.Model):
doc_fields = models.CharField( max_length=50)
fs_edited = FileSystemStorage(location=PRIVATE_STORAGE_ROOT)
class DocEdited(models.Model):
edited_description = models.CharField(max_length=250, blank=True)
document_edited = models.FileField(upload_to='documents_edited/', storage=fs_edited)
def __str__(self):
return self.edited_description
在这里,我使用EditedDocumentForm类创建一个ModelForm,然后将其传递给我的views.py edit_files函数,最后6行。
forms.py
from django import forms
from .models import DocFile
from django import forms
from .models import DocFile , DocEdited
class DocumentForm(forms.ModelForm):
class Meta:
model = DocFile
fields = ('description', 'document')
class RawProductionForm(forms.Form):
title_forms = forms.CharField(label='')
class VariablesForm(forms.Form):
def __init__(self, *args, **kwargs):
variables = kwargs.pop('variables')
super().__init__(*args, **kwargs)
for i, variable in enumerate(variables):
self.fields['custom_%s' % i] = forms.CharField(label=variable)
def get_input_text(self):
for name, value in self.cleaned_data.items():
if name.startswith('custom_'):
yield (self.fields[name].label, value)
class EditedDocumentForm(forms.ModelForm):
class Meta:
model = DocEdited
fields = ('edited_description','document_edited')
查看edit_files函数的最后6行
views.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.views.generic import TemplateView
from django.shortcuts import render, redirect, get_object_or_404
from django.core.files.storage import FileSystemStorage
from django.shortcuts import redirect
from django.core.files import File
from .forms import DocumentForm, RawProductionForm, VariablesForm, EditedDocumentForm
from .models import DocFile, DocFields
import os
import re
from docx import Document
class Home(TemplateView):
template_name = 'home.html'
def file_list(request):
documents = DocFile.objects.all()
return render(request, 'file_list.html',{
'documents': documents
})
def upload_files(request):
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect("file_list")
else:
form = DocumentForm()
return render(request, 'upload_files.html',{
'form': form
})
def docx_words_replace(doc_obj, regex, replace):
for p in doc_obj.paragraphs:
if regex.search(p.text):
inline = p.runs
for i in range(len(inline)):
if regex.search(inline[i].text):
text = regex.sub(replace, inline[i].text)
inline[i].text = text
for table in doc_obj.tables:
for row in table.rows:
for cell in row.cells:
docx_words_replace(cell, regex, replace)
def edit_files(request, file_id):
instance = get_object_or_404(DocFile, id=file_id)
exact_file = Document(instance.document)
variables = []
for paragraph in exact_file.paragraphs:
match = re.findall(r"\{(.*?)\}", paragraph.text)
variables.append(match)
for table in exact_file.tables:
for row in table.rows:
for cell in row.cells:
match = re.findall(r"\{(.*?)\}", cell.text)
variables.append(match)
exact_file.save('green.pdf')
temporary_list = []
for i in variables:
for j in i :
if len(j) > 0:
temporary_list.append(j)
variables = temporary_list
# https://stackoverflow.com/questions/9792664/set-changes-element-order
variables_set = sorted(set(variables), key=variables.index)
inputs_amount = len(variables)
print(variables)
inputs_list = []
my_form = VariablesForm(request.POST, variables=variables_set)
# Start changing variables
if request.method == 'POST':
print(my_form)
input_texts = my_form.get_input_text()
for i, input_text in input_texts:
inputs_list.append(input_text)
print(inputs_list)
my_dict = dict(zip(variables_set, inputs_list))
print(my_dict)
for word , replacement in my_dict.items():
word_re = re.compile(word)
docx_words_replace(exact_file, word_re, replacement)
regex1 = re.compile(r"{")
regex2 = re.compile(r"}")
replace = r""
docx_words_replace(exact_file, regex1, replace)
docx_words_replace(exact_file, regex2, replace)
if len(inputs_list) != 0:
files_full_name = inputs_list[0] + '.docx'
nm = EditedDocumentForm(files_full_name, File(exact_file))
nm.save()
return render(request, 'edit_files.html', context={'variables': variables, "form": my_form})
def delete_book(request, pk):
if request.method == 'POST':
got_to_delete = DocFile.objects.get(pk=pk)
got_to_delete.delete()
return redirect('file_list')
这是我的错误:
Traceback (most recent call last):
File "/home/grigor/pdf_3/venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/grigor/pdf_3/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 126, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/grigor/pdf_3/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 124, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/grigor/pdf_3/blanks/views.py", line 109, in edit_files
nm.save()
File "/home/grigor/pdf_3/venv/lib/python3.6/site-packages/django/forms/models.py", line 449, in save
if self.errors:
File "/home/grigor/pdf_3/venv/lib/python3.6/site-packages/django/forms/forms.py", line 180, in errors
self.full_clean()
File "/home/grigor/pdf_3/venv/lib/python3.6/site-packages/django/forms/forms.py", line 381, in full_clean
self._clean_fields()
File "/home/grigor/pdf_3/venv/lib/python3.6/site-packages/django/forms/forms.py", line 393, in _clean_fields
value = field.widget.value_from_datadict(self.data, self.files, self.add_prefix(name))
File "/home/grigor/pdf_3/venv/lib/python3.6/site-packages/django/forms/widgets.py", line 246, in value_from_datadict
return data.get(name)
AttributeError: 'str' object has no attribute 'get'