You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法渲染用户专属内容: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">&times;</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">&times;</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í

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:48:45