无法渲染用户专属内容:Django中展示用户发布职位的问题
问题描述
我尝试渲染用户专属的模型对象,但所有方法都不管用,已经折腾很久了。想要实现的效果是在manage-jobs.html模板里查看自己发布的职位。另外我已经删掉了所有渲染用户专属内容的失败尝试代码,不是没自己试过解决。
models.py
class Job(models.Model): company = models.CharField(max_length=40, null=True, verbose_name="Company/Employer") description = models.TextField(null=True) role = models.CharField(max_length=25) area_of_filming = models.CharField(max_length=50, verbose_name="Area Of Filming", default="") contact_email = models.EmailField(verbose_name='Contact Email', max_length=60, default='') created = models.DateTimeField(auto_now_add=True) user = models.ForeignKey(Account, default='', null=True, on_delete=models.CASCADE) def __str__(self): return self.company class Account(AbstractBaseUser): email = models.EmailField(verbose_name='email', max_length=60, unique=True) name = models.CharField(max_length=45, unique=False) date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True) last_login = models.DateTimeField(verbose_name='last login', auto_now=True) is_admin = models.BooleanField(default=False) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) is_superuser = models.BooleanField(default=False) is_employee = models.BooleanField(default=True, verbose_name='Are you using FilmLink as an employee?') USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['name', 'is_employee'] objects = MyAccountManager() class Meta: permissions = [ ("post_jobs", "Can post jobs"), ] def __str__(self): return self.name def has_perm(self, perm, obj=None): return True def has_perms(self, perm): return True def has_module_perms(self, app_label): return True @property def is_staff(self): return self.is_admin
views.py
@login_required(login_url='login') def manage_jobs(request): if request.user.is_employee: return redirect('home') else: form = JobForm(request.POST) if form.is_valid(): form.save() context = {"form":form} return render(request, 'employer/manage-jobs.html', context)
manage-jobs.html
<button id="myBtn">Post A Job</button> <div id="main"></div> <div id="myModal" class="modal"> <div class="modal-content"> <span class="close">×</span> <form action="" method="POST"> {% csrf_token %} <div id="company-container"> <p>Employer Name</p> <p id="employer">{{form.company}}</p> </div> <div id="role-container"> <p>Role (e.g. Actor, Director)</p> <p id="role">{{form.role}}</p> </div> <div class="area-of-filming-container"> <p>Area Of Production/Filming</p> <p id="area-of-filming">{{form.area_of_filming}}</p> </div> <div id="contact-email-container"> <p>Contact Email</p> <p id="contact-email">{{form.contact_email}}</p> </div> <div id="description-container"> <p>Description Of Job</p> <p id="description">{{form.description}}</p> </div> <button type="submit" id="post-job">Publish Job</button> </form> </div> </div>
解决方案
1. 修复视图逻辑,关联用户并查询专属职位
修改views.py中的manage_jobs函数,区分GET/POST请求,保存职位时关联当前用户,同时查询该用户的所有职位:
@login_required(login_url='login') def manage_jobs(request): if request.user.is_employee: return redirect('home') # 获取当前用户发布的所有职位,按创建时间倒序排列 user_jobs = Job.objects.filter(user=request.user).order_by('-created') if request.method == 'POST': form = JobForm(request.POST) if form.is_valid(): job = form.save(commit=False) # 关联当前登录用户 job.user = request.user job.save() # 提交后重定向避免重复提交 return redirect('manage_jobs') else: # GET请求时创建空表单 form = JobForm() context = { "form": form, "user_jobs": user_jobs } return render(request, 'employer/manage-jobs.html', context)
2. 在模板中渲染用户专属职位
修改manage-jobs.html,在main容器中添加职位列表的渲染代码:
<button id="myBtn">Post A Job</button> <div id="main"> <!-- 渲染用户发布的职位 --> {% if user_jobs %} <h3>我的发布职位</h3> <div class="job-list"> {% for job in user_jobs %} <div class="job-item"> <h4>{{ job.company }} - {{ job.role }}</h4> <p><strong>拍摄地区:</strong> {{ job.area_of_filming }}</p> <p><strong>联系方式:</strong> {{ job.contact_email }}</p> <p>{{ job.description|truncatewords:20 }}</p> <p><small>发布时间: {{ job.created|date:"Y-m-d H:i" }}</small></p> </div> {% endfor %} </div> {% else %} <p>你还没有发布任何职位。</p> {% endif %} </div> <div id="myModal" class="modal"> <!-- 原模态框代码保持不变 --> <div class="modal-content"> <span class="close">×</span> <form action="" method="POST"> {% csrf_token %} <div id="company-container"> <p>Employer Name</p> <p id="employer">{{form.company}}</p> </div> <div id="role-container"> <p>Role (e.g. Actor, Director)</p> <p id="role">{{form.role}}</p> </div> <div class="area-of-filming-container"> <p>Area Of Production/Filming</p> <p id="area-of-filming">{{form.area_of_filming}}</p> </div> <div id="contact-email-container"> <p>Contact Email</p> <p id="contact-email">{{form.contact_email}}</p> </div> <div id="description-container"> <p>Description Of Job</p> <p id="description">{{form.description}}</p> </div> <button type="submit" id="post-job">Publish Job</button> </form> </div> </div>
关键说明
- 保存职位时必须用
commit=False先获取未提交的对象,再关联request.user,最后保存,否则职位不会绑定到当前用户。 - 查询用户专属职位使用
Job.objects.filter(user=request.user),确保只显示当前用户发布的内容。 - 模板中使用Django模板语法遍历
user_jobs,可根据实际需求调整显示字段和样式。
内容的提问来源于stack exchange,提问作者Ruairí
相关产品推荐
相关产品推荐

