Django创建Primary模型时仅显示当前用户的Album数据
解决方法
1. 给Album模型添加用户关联字段
首先确认你的Album模型是否关联了用户,没有的话先补上这个字段,用来标记每个Album的创建者:
# models.py from django.contrib.auth.models import User class Album(models.Model): # 保留你原有的其他字段 user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_albums') # 添加后记得执行迁移:`python manage.py makemigrations` 和 `python manage.py migrate`
2. 修改视图的Album查询逻辑
在处理Primary创建请求的视图里,把全量查询改成只筛选当前登录用户的Album:
# views.py from django.contrib.auth.decorators import login_required from .models import Album, Primary @login_required # 限制只有登录用户能访问该视图 def create_primary(request): if request.method == 'GET': # 只获取当前用户创建的Album user_albums = Album.objects.filter(user=request.user) return render(request, 'create_primary.html', {'albums': user_albums}) elif request.method == 'POST': # 处理表单提交时,额外校验Album属于当前用户 album_id = request.POST.get('year_of_graduations') try: target_album = Album.objects.get(id=album_id, user=request.user) except Album.DoesNotExist: # 处理用户提交不属于自己的Album的情况,比如返回错误提示 return render(request, 'create_primary.html', {'albums': Album.objects.filter(user=request.user), 'error': '无效的专辑选择'}) # 构建Primary实例并保存 primary = Primary( year_of_graduations=target_album, # 赋值其他字段 ) primary.save() # 跳转或返回成功响应
3. 模板中的HTML表单
模板里的下拉框只会渲染当前用户的Album选项:
<!-- create_primary.html --> <form method="POST"> {% csrf_token %} {% if error %} <p style="color:red;">{{ error }}</p> {% endif %} <label for="year_of_graduations">毕业年份专辑:</label> <select name="year_of_graduations" id="year_of_graduations" required> {% for album in albums %} <option value="{{ album.id }}">{{ album.title }}</option> <!-- 替换成你Album模型里用来显示的字段 --> {% endfor %} </select> <!-- 其他表单字段 --> <button type="submit">提交</button> </form>
关键说明
@login_required必须加上,防止匿名用户访问时request.user出现异常。- POST请求里的Album校验不能少,避免用户通过修改表单参数提交不属于自己的Album数据。
内容的提问来源于stack exchange,提问作者Adamu Abdulkarim Dee
相关产品推荐
相关产品推荐

