python:基于django的html二维码页面生成功能页面

前言

这里给出一个基于django 的html二维码页面生成功能 页面,具有文件上传订单提交两个功能,使用javascript来代理实现交互功能(包含无限扩展内容框生成功能)。

注意:这只是前端html代码和css代码,没有包含后端数据处理

代码

qrcode_create.html

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>自定义二维码-产品详情上传</title>
    <link rel="stylesheet" href="/static/css/create_qrcode.css">
</head>
<body>
    <h2>产品详情</h2>
    <form id="uploadForm" enctype="multipart/form-data" method="post" action="">
        <input name="code" value="{{ code }}" hidden/>
        <div>
            <label for="page_title">页面标题:</label>
            <input type="text" id="page_title" name="page_title" placeholder="输入标题"  maxlength="64">
        </div>
		<div>
		    <label for="head_title">首行展示标题:</label>
		    <input type="text" id="head_title" name="head_title" placeholder="输入标题"  maxlength="64">
		</div>
		<div>
		    <label for="target_name">目标名称:</label>
		    <input type="text" id="target_name" name="target_name" placeholder="输入标题"  maxlength="64">
		</div>
		<div>
		    <label for="head_imgs_check">轮询图片:</label>
		    <input type="file" id="head_imgs_check" name="file" onchange="uploadFile('head_imgs_check', 'head_imgs')">
            <input type="file" id="head_imgs_check1" name="file" onchange="uploadFile('head_imgs_check1', 'head_imgs')">
            <input type="file" id="head_imgs_check2" name="file" onchange="uploadFile('head_imgs_check2', 'head_imgs')">
		</div>
        <div>
            <label for="content">最后的按钮内容:</label>
            <textarea id="final_button_text" name="final_button_text" placeholder="输入内容"  maxlength="16"></textarea>
        </div>
        <div>
            <label for="fileInput">最后的按钮跳转链接:</label>
            <textarea id="final_button_url" name="final_button_url" placeholder="输入链接地址"></textarea>
        </div>
		<div id="more_checks"></div>
		<button type="button" onclick="addMoreFields()">增加更多字段</button>
        <button type="submit">生成页面二维码</button>
    </form>
</body>
<script>
    // 定义一个全局变量
    var add_num = 0;

    function uploadFile(old_id, id) {
        var fileInput = document.getElementById('fileInput'); // 假设你的文件输入框的 id 是 'fileInput'
        var files = fileInput.files;

        if (files.length === 0) {
            alert("请选择文件");
            return;
        }

        if (files.length > 10) {
            alert("文件数量超限");
            return;
        }

        // 检查每个文件的大小
        for (let i = 0; i < files.length; i++) {
            if (files[i].size > 10 * 1024 * 1024) { // 10MB
                alert(`文件 "${files[i].name}" 超过了 10MB 的大小限制。\n`);
                return;
            }
        }

        var formData = new FormData();

        // 遍历所有选中的文件
        for (var i = 0; i < files.length; i++) {
            formData.append('files[]', files[i]); // 使用 'files[]' 作为字段名以处理多个文件
        }

        // 可以根据需要添加其他字段
        formData.append('code', '{{ code }}');

        fetch('/file/upload', {
            method: 'POST',
            body: formData
        })
        .then(response => response.json())
        .then(data => {
            if (data.status === true) {
                document.getElementById(old_id).insertAdjacentHTML('beforeend', `<input type="hidden" name=${id} value="[img]${data.data}">`);
                alert("文件上传成功");

                // 文件上传成功后,将输入框类型改为只读文本框
                var input = document.getElementById(old_id);
                input.setAttribute('type', 'text');
                input.setAttribute('value', '[img]' + data.data);
                input.setAttribute('readonly', 'readonly');
            } else {
                alert("文件上传失败: " + data.msg);
            }
        })
        .catch(error => {
            console.error('文件上传失败:', error);
            alert("文件上传失败,请重试");
        });
    }

    function addMoreFields() {
        // 每次执行时增加 add_num 的值
        add_num++;
        console.log(add_num)
        var additionalFields = `
            <div>
                <label for="contentType">内容类型:</label>
                <input type="radio" id="paragraphOption_${add_num}" name="contentType_${add_num}" value="paragraph" onclick="showContent('paragraph', ${add_num})">段落
                <input type="radio" id="imageOption_${add_num}" name="contentType_${add_num}" value="image" onclick="showContent('image', ${add_num})">图片
            </div>
            <div id="paragraphContent_${add_num}" style="display: none;">
                <label for="additionalContent">段落:</label>
                <textarea id="additionalContent" name="additionalContent" maxlength="255"></textarea>
            </div>
            <div id="imageContent_${add_num}" style="display: none;">
                <label for="additionalFileInput">图片:</label>
                <input type="file" id="additionalFileInput_${add_num}_check" onchange="uploadFile('additionalFileInput_${add_num}_check', 'additionalContent')">
            </div>
        `;
        document.getElementById('more_checks').insertAdjacentHTML('beforeend', additionalFields);
    }

    function showContent(contentType, check_num) {
        console.log(contentType, check_num)
        var paragraphContent = document.getElementById("paragraphContent_" + check_num);
        var imageContent = document.getElementById("imageContent_"  + check_num);

        if (contentType === 'paragraph') {
            paragraphContent.style.display = "block";
            imageContent.style.display = "none";
        } else if (contentType === 'image') {
            paragraphContent.style.display = "none";
            imageContent.style.display = "block";
        }
    }
</script>
</html>

create_qrcode.css

css 复制代码
body {
    font-family: Arial, sans-serif;
    background-color: #f4f4f4;
    margin: 0;
    padding: 20px;
}

h2 {
    color: #333;
}

form {
    background-color: #fff;
    padding: 20px;
    border-radius: 5px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
    margin-bottom: 20px;
}

div {
    margin-bottom: 10px;
}

label {
    font-weight: bold;
    margin-bottom: 5px;
    display: block;
}

input[type="text"],
textarea {
    width: 100%;
    padding: 8px;
    border: 1px solid #ccc;
    border-radius: 5px;
    box-sizing: border-box;
}

input[type="file"] {
    width: 100%;
    margin-top: 5px;
}

button {
    padding: 10px 20px;
    background-color: #007bff;
    color: #fff;
    border: none;
    border-radius: 5px;
    cursor: pointer;
    transition: background-color 0.3s ease;
}

button:hover {
    background-color: #0056b3;
}

.additional-fields {
    display: none;
}
相关推荐
不去幼儿园6 分钟前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
幽兰的天空1 小时前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
学不会•3 小时前
css数据不固定情况下,循环加不同背景颜色
前端·javascript·html
网易独家音乐人Mike Zhou5 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
安静读书5 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
小二·6 小时前
java基础面试题笔记(基础篇)
java·笔记·python
小喵要摸鱼8 小时前
Python 神经网络项目常用语法
python
一念之坤9 小时前
零基础学Python之数据结构 -- 01篇
数据结构·python
猫爪笔记9 小时前
前端:HTML (学习笔记)【1】
前端·笔记·学习·html
wxl7812279 小时前
如何使用本地大模型做数据分析
python·数据挖掘·数据分析·代码解释器