【问题标题】:how to us the prefix?如何给我们前缀?
【发布时间】:2022-12-12 09:37:46
【问题描述】:

我尝试使用一个提交按钮上传两个表单。 用户可以选择 pdf 文件和 excel 文件。然后上传这两个文件。然后返回两者的内容。

所以我尝试用一​​个提交按钮上传两个文件。

但是两个选择的文件选项对于上传文件是不可见的。

所以我有这样的模板:

{% extends 'base.html' %} {% load static %} {% block content %}

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Create a Profile</title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
        <link rel="stylesheet" type="text/css" href="{% static 'main/css/custom-style.css' %}" />
        <link rel="stylesheet" type="text/css" href="{% static 'main/css/bootstrap.css' %}" />
    </head>
    <body>
        <div class="container center">
            <span class="form-inline" role="form">
                <div class="inline-div">
                    <form class="form-inline" action="/controlepunt140" method="POST" enctype="multipart/form-data">

                        <div class="d-grid gap-3">
                            <div class="form-group">
                                {% csrf_token %}
                                {{ form.0.as_p }} 
                                <button type="submit" name="form_pdf" class="btn btn-warning">Upload!</button>
                            </div>
                            <div class="form-outline">
                                <div class="form-group">
                                    <textarea class="inline-txtarea form-control" id="content" cols="70" rows="25">
                                    {{content}}</textarea>
                                </div>
                            </div>
                        </div>

                        <div class="d-grid gap-3">
                            <div class="form-group">
                                {{ form.1.as_p }} 
                            </div>
                            <div class="form-outline">
                                <div class="form-group">
                                    <textarea class="inline-txtarea form-control" id="content" cols="70" rows="25">
                                    {{conten_excel}}</textarea>
                                </div>
                            </div>
                        </div>
                    </form>
                </div>
            </span>
        </div>  
    </body>
</html>
{% endblock content %}

和 views.py:

class ReadingFile(View):
    def get(self, *args, **kwargs):
        return render(self.request, "main/controle_punt140.html", {
            "form1": UploadFileForm(),
            "form2": ExcelForm()
        })

    def post(self, *args, **kwargs):
        filter_text = FilterText()
        types_of_encoding = ["utf8", "cp1252"]
        form1 = UploadFileForm(
            self.request.POST, self.request.FILES, prefix="form1")
        form2 = ExcelForm(self.request.FILES,
                          self.request.FILES, prefix="form2")
        content = ''
        content_excel = ''

        if form1.is_valid() and form2.is_valid() and self.request.POST:
            uploadfile = UploadFile(image=self.request.FILES["upload_file"])
            excel_file = self.request.FILES["upload_file"]

            uploadfile.save()

            for encoding_type in types_of_encoding:
                with open(os.path.join(settings.MEDIA_ROOT, f"{uploadfile.image}"), 'r', encoding=encoding_type) as f:
                    if uploadfile.image.path.endswith('.pdf'):
                        content = filter_text.show_extracted_data_from_file(
                            uploadfile.image.path)
                    else:
                        content = f.read()

                    if uploadfile.image.path.endswith('xlsx'):

                        wb = openpyxl.load_workbook(excel_file)
                        worksheet = wb['Sheet1']
                        print(worksheet)
                        excel_data = list()

                        for row in worksheet.iter_rows():
                            row_data = list()
                            for cell in row:
                                row_data.append(str(cell.value))
                                excel_data.append(row_data)
                                print(excel_data)
                                content_excel = excel_data

                        else:
                            content_excel = f.read()

                return render(self.request, "main/controle_punt140.html", {
                    'form1': ExcelForm(),
                    'form2': UploadFileForm(),
                    "content": [content, content_excel]
                })

        # I've adjusted the indent here to what I think it should be.
        return render(self.request, "main/controle_punt140.html", {
            "form1": form1,
            "form2": form2,
        })

和表格.py:

class UploadFileForm(forms.Form):
    upload_file = forms.FileField(required=False)


class ExcelForm(forms.Form):
    upload_file = forms.FileField(required=False)

网址.py:

urlpatterns = [  
    path('', views.starting_page, name='starting_page'),
    path('controlepunt140', views.ReadingFile.as_view(), name='controlepunt140'),    
]

【问题讨论】:

    标签: python django


    【解决方案1】:

    模板中使用的变量名是钥匙字典的,而不是值。价值是什么插入当 django 呈现页面时进入模板。

    你的模板中有{{form1.as__p}},但你发送"form": [form1, form2]作为你的上下文,所以模板中的变量应该是{{ form.0.as_p }}{{ form.1.as_p }}。我没有测试过这个,但如果它不起作用,你可以像这样分别发送这两种形式:

    from django.shortcuts import redirect
    
    class ReadingFile(View):
        def get(self, *args, **kwargs):
            return render(self.request, "main/controle_punt140.html", {
                "form1": UploadFileForm(),
                "form2": ExcelForm()
            })
    
        def post(self, *args, **kwargs):
            filter_text = FilterText()
            types_of_encoding = ["utf8", "cp1252"]
            form1 = UploadFileForm(self.request.POST, self.request.FILES, prefix="form1")
            form2 = ExcelForm(self.request.FILES, self.request.FILES, prefix="form2")
            content = ''
            content_excel = ''
    
            if form1.is_valid() and form2.is_valid() and self.request.POST:
                uploadfile = UploadFile(image=self.request.FILES["upload_file"])
                excel_file = self.request.FILES["upload_file"]
    
                uploadfile.save()
    
                for encoding_type in types_of_encoding:
                    with open(os.path.join(settings.MEDIA_ROOT, f"{uploadfile.image}"), 'r', encoding=encoding_type) as f:
                        if uploadfile.image.path.endswith('.pdf'):
                            content = filter_text.show_extracted_data_from_file(
                                uploadfile.image.path)
                        else:
                            content = f.read()
    
                        if uploadfile.image.path.endswith('xlsx'):
                            
                            #Uploading excel form:
                            #this is just logic. 
                             pass
    
                            else:
                                content_excel = f.read()
                    
                    # You probably should do a redirect after the form is
                    # submitted, rather than render the page.
                    return redirect('main:controlepunt140')
                    # return render(self.request, "main/controle_punt140.html", {
                        'form1': ExcelForm(), 
                        'form2': UploadFileForm(),
                        "content": [content, content_excel]
                    })
            
            # I've adjusted the indent here to what I think it should be.
            return render(self.request, "main/controle_punt140.html", {
                "form1": form1, 
                "form2": form2,
            })
    
    

    在提交并成功保存表单后,您可能还应该更改为重定向。查看Post/Redirect/Get 和/或rendering content after a succesful post request

    编辑

    将模板更改为使用 {{ form.0.as_p }},如 @nigel239 所示

    您可以重定向到提交表单的同一页面,因此如果用户出于某种原因点击浏览器上的刷新按钮,您将不会收到要求用户重新发送表单的警告框。

    【讨论】:

    • 很好的解释,但是索引不适用于模板中的括号;你使用点语法:'{{form.0.as_p}}'
    • 感谢@nigel239 的评论。我从来没有发现需要在我的项目中传递表单列表,现在我知道怎么做了。我已经编辑了我的答案。
    • @mightycodeNewton,您可以重定向到同一页面。这是一种常见的模式。我需要知道您的 urls.py 路径才能找到显示相关页面的正确路径。我已经编辑了我的答案。希望这可以帮助。
    • @mightycodeNewton 它{{ form.0.as_p }} 因为 python 列表以 0 作为第一个元素进行索引。您将第一个元素命名为“form1”并不重要。
    • 我正在努力先尝试一下。
    猜你喜欢
    • 2020-06-10
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多