如何将用户选中的股票列表保存至Django数据库?
解决用户关注股票的数据库存储问题
首先,你的模型目前缺少用户和股票之间的核心关联关系——一个用户可以关注多只股票,一只股票也能被多个用户关注,所以多对多字段是最合适的选择。我们一步步来解决:
1. 更新模型代码
先修改Profile类,添加多对多字段关联Stock,补全之前没写完的OneToOneField参数:
# models.py from django.contrib.auth.models import User # 记得导入内置User模型 class Stock(models.Model): name = models.CharField(max_length=50) ticker = models.CharField(max_length=50) def __str__(self): return self.name class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) # 补全级联删除参数 followed_stocks = models.ManyToManyField(Stock, related_name='followers', blank=True) def __str__(self): return f"{self.user.username}'s Profile"
这里related_name='followers'方便后续从某只股票反向查询哪些用户关注了它,blank=True允许用户初始状态下没有关注任何股票。
2. 处理视图中的保存逻辑
假设你通过POST请求提交选中的股票,在视图里可以这样处理stocks_user_selected列表:
# views.py from django.shortcuts import render, redirect from .models import Profile, Stock from django.contrib.auth.decorators import login_required @login_required # 确保只有登录用户才能操作关注列表 def save_followed_stocks(request): if request.method == 'POST': # 如果你已经有stocks_user_selected列表(比如前端传过来的股票ID或对象) # 示例:如果是股票ID列表,直接用set方法关联 selected_stock_ids = request.POST.getlist('stock_ids') # 或者你的stocks_user_selected # 获取当前用户的Profile,不存在则自动创建(避免用户没有Profile的报错) profile, created = Profile.objects.get_or_create(user=request.user) # 更新关注列表:先清空原有关联,再添加新选中的股票(也可以用add方法按需添加) profile.followed_stocks.set(selected_stock_ids) return redirect('your_success_page') # 跳转到保存成功后的页面 # GET请求时返回股票选择页面 all_stocks = Stock.objects.all() return render(request, 'stock_selection.html', {'stocks': all_stocks})
如果你的stocks_user_selected是股票对象的列表而非ID,直接替换成profile.followed_stocks.set(stocks_user_selected)即可。
3. 模板表单示例(优化用户体验)
确保前端复选框能正确传递股票ID,同时标记用户已关注的股票:
<!-- stock_selection.html --> <form method="POST"> {% csrf_token %} {% for stock in stocks %} <label> <input type="checkbox" name="stock_ids" value="{{ stock.id }}" {% if stock in request.user.profile.followed_stocks.all %}checked{% endif %}> {{ stock.name }} ({{ stock.ticker }}) </label><br> {% endfor %} <button type="submit">保存我的关注列表</button> </form>
4. 最后别忘了迁移数据库
修改模型后,执行以下命令让数据库同步变更:
python manage.py makemigrations python manage.py migrate
完成这些步骤后,用户选中的股票就会持久化到数据库里了。后续你可以通过request.user.profile.followed_stocks.all()快速获取用户关注的所有股票,用来展示对应的相关文章。
内容的提问来源于stack exchange,提问作者justino1998
相关产品推荐
相关产品推荐

