Django中Job按用户过滤无数据,如何设置contact_email默认值?
用户专属Job渲染及默认邮箱设置问题解决方案
问题背景
- 使用
Job.objects.filter(user = request.user)无法渲染用户发布的Job实例,但Job.objects.all()可正常展示所有数据,目标是仅显示当前登录用户发布的内容。 - 当前通过
contact_email=request.user.email过滤虽可行,但用户可在表单中随意填写邮箱;计划移除表单的contact_email字段,自动将其设为当前登录用户的邮箱,多次尝试未成功。
一、修复用户专属Job过滤失效问题
问题根源
创建Job时未将user字段关联到当前登录用户,导致数据库中Job的user字段为空,过滤时无匹配结果。
解决方案:修改视图保存逻辑
更新views.py中的manage_jobs函数,在保存Job时手动关联当前用户:
@login_required(login_url='login') def manage_jobs(request): if request.user.is_employee: return redirect('home') # 兼容GET/POST请求,GET时初始化空表单 form = JobForm(request.POST or None) if request.method == 'POST' and form.is_valid(): # 获取未保存的Job实例 job_instance = form.save(commit=False) # 关联当前登录用户 job_instance.user = request.user # 自动填充联系邮箱为用户邮箱 job_instance.contact_email = request.user.email # 保存到数据库 job_instance.save() # 重定向避免重复提交 return redirect('manage-jobs') # 现在可通过user字段正确过滤 jobs = Job.objects.filter(user=request.user) context = {"form": form, "jobs": jobs} return render(request, 'employer/manage-jobs.html', context)
二、移除表单中的contact_email字段
假设使用ModelForm创建JobForm,修改forms.py(无则新建),排除不需要用户填写的字段:
from django import forms from .models import Job class JobForm(forms.ModelForm): class Meta: model = Job # 仅保留需要用户输入的字段,排除自动填充的字段 fields = ['company', 'description', 'role', 'area_of_filming']
三、优化模型字段配置
调整models.py中Job模型的user字段,移除不合理的默认值:
class Job(models.Model): # 其他字段保持不变 user = models.ForeignKey(Account, null=True, on_delete=models.CASCADE) # 去掉default=''
验证效果
- 登录用户发布新Job时,
user和contact_email字段会自动填充为当前用户信息 - 使用
Job.objects.filter(user=request.user)可正确获取该用户发布的所有Job实例
内容的提问来源于stack exchange,提问作者Ruairí
相关产品推荐
相关产品推荐

