基于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
相关产品推荐
相关产品推荐

