You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Django开发带联动下拉的用户信息表单:生成QR Code并存储至MySQL

基于Django的印度地区信息收集平台实现方案

1. 项目初始化与配置

  • 创建Django项目和应用:
    django-admin startproject user_info_platform
    cd user_info_platform
    python manage.py startapp user_data
    
  • 配置MySQL数据库(修改settings.py):
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'user_info_db',
            'USER': '你的MySQL用户名',
            'PASSWORD': '你的MySQL密码',
            'HOST': 'localhost',
            'PORT': '3306',
        }
    }
    
  • 安装依赖:
    pip install mysqlclient qrcode[pil]
    

2. 模型设计(user_data/models.py)

from django.db import models

class State(models.Model):
    name = models.CharField(max_length=100, unique=True)

    def __str__(self):
        return self.name

class City(models.Model):
    name = models.CharField(max_length=100)
    state = models.ForeignKey(State, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class UserInfo(models.Model):
    name = models.CharField(max_length=100)
    state = models.ForeignKey(State, on_delete=models.CASCADE)
    city = models.ForeignKey(City, on_delete=models.CASCADE)
    qr_code = models.ImageField(upload_to='qr_codes/', blank=True)

    def __str__(self):
        return self.name

执行迁移命令:

python manage.py makemigrations
python manage.py migrate

3. 表单与视图实现

表单逻辑(user_data/forms.py)

from django import forms
from .models import UserInfo, State, City

class UserInfoForm(forms.ModelForm):
    state = forms.ModelChoiceField(queryset=State.objects.all(), empty_label="选择邦")
    city = forms.ModelChoiceField(queryset=City.objects.none(), empty_label="选择城市")

    class Meta:
        model = UserInfo
        fields = ['name', 'state', 'city']

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if 'state' in self.data:
            try:
                state_id = int(self.data.get('state'))
                self.fields['city'].queryset = City.objects.filter(state_id=state_id).order_by('name')
            except (ValueError, TypeError):
                pass
        elif self.instance.pk:
            self.fields['city'].queryset = self.instance.state.city_set.order_by('name')

核心视图(user_data/views.py)

from django.shortcuts import render, redirect
from .forms import UserInfoForm
import qrcode
from io import BytesIO
from django.core.files.base import ContentFile
from django.core.mail import EmailMessage
from django.conf import settings

def submit_user_info(request):
    if request.method == 'POST':
        form = UserInfoForm(request.POST)
        if form.is_valid():
            user_info = form.save(commit=False)
            # 生成QR码
            qr_content = f"姓名: {user_info.name}\n邦: {user_info.state.name}\n城市: {user_info.city.name}"
            qr_img = qrcode.make(qr_content)
            buffer = BytesIO()
            qr_img.save(buffer, format='PNG')
            buffer.seek(0)
            user_info.qr_code.save(f"{user_info.name}_qr.png", ContentFile(buffer.read()), save=False)
            user_info.save()

            # 发送代码邮件(需提前配置邮箱参数)
            email = EmailMessage(
                'Django项目代码交付',
                '附件为完成的项目代码压缩包,请查收',
                settings.EMAIL_HOST_USER,
                ['接收邮箱地址']
            )
            # 需先将项目打包为zip文件
            email.attach_file('user_info_platform.zip')
            email.send()

            return redirect('success')
    else:
        form = UserInfoForm()
    return render(request, 'submit_form.html', {'form': form})

def success(request):
    return render(request, 'success.html')

# 邦-城市联动接口
def get_cities(request):
    state_id = request.GET.get('state_id')
    cities = City.objects.filter(state_id=state_id).order_by('name')
    options = '<option value="">选择城市</option>'
    for city in cities:
        options += f'<option value="{city.id}">{city.name}</option>'
    return HttpResponse(options)

4. 前端模板与联动逻辑

提交表单模板(templates/submit_form.html)

<!DOCTYPE html>
<html>
<head>
    <title>用户信息录入</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script>
        $(document).ready(function(){
            $('#id_state').change(function(){
                const stateId = $(this).val();
                $.ajax({
                    url: '/get_cities/',
                    data: {'state_id': stateId},
                    success: function(data){
                        $('#id_city').html(data);
                    }
                });
            });
        });
    </script>
</head>
<body>
    <h1>用户信息录入</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <button type="submit">提交</button>
    </form>
</body>
</html>

成功页面模板(templates/success.html)

<!DOCTYPE html>
<html>
<head>
    <title>提交成功</title>
</head>
<body>
    <h1>信息提交成功!QR码已生成并存储</h1>
    <a href="/">返回录入页面</a>
</body>
</html>

5. URL配置(user_info_platform/urls.py)

from django.contrib import admin
from django.urls import path
from user_data.views import submit_user_info, success, get_cities

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', submit_user_info, name='submit'),
    path('success/', success, name='success'),
    path('get_cities/', get_cities, name='get_cities'),
]

6. 邮箱配置(settings.py)

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = '你的SMTP服务器地址'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = '你的邮箱地址'
EMAIL_HOST_PASSWORD = '你的邮箱授权码'

额外说明

  • 需提前在MySQL中创建user_info_db数据库
  • 通过Django admin后台批量导入印度的邦和城市数据
  • 在settings.py中配置MEDIA_ROOT和MEDIA_URL,用于存储生成的QR码图片

内容的提问来源于stack exchange,提问作者Chandresh . T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 19:50:29