简体   繁体   English

django | model.objects.filter(user = request.user) 不返回任何数据

[英]django | model.objects.filter(user = request.user) not returning any data

I've been trying to render out user specific content, but when I use the line 'Job.objects.filter(user = request.user)' I don't get anything rendered in the form.我一直在尝试呈现用户特定的内容,但是当我使用“Job.objects.filter(user = request.user)”行时,我没有在表单中呈现任何内容。 I don't think that the problem is the template because when I use the line Job.objects.all() all instances are rendered out with no problem.我不认为问题出在模板上,因为当我使用 Job.objects.all() 行时,所有实例都会毫无问题地呈现出来。 What I'm trying to do is render out the instances that are 'posted' by a user.我要做的是渲染出用户“发布”的实例。

views.py视图.py

@login_required(login_url='login')
def manage_jobs(request):
    if request.user.is_employee:
        return redirect('home')
    else:
        form = JobForm(request.POST)
        jobs = Job.objects.filter(user=request.user)
        if form.is_valid():
            form.save()
        context = {"form":form, "jobs":jobs}
        return render(request, 'employer/manage-jobs.html', context)
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

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

manage-jobs.html管理作业。html

{% load static %}
<!DOCTYPE html>
<html lang="en">
  <head>
    <title>FilmLink</title>
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <link rel="stylesheet" href="{% static 'lng/css/manage-jobs.css' %}" />
    <link rel="stylesheet" href="{% static 'lng/css/manage-jobs-nav.css' %}" />
  </head>
  <body>
    
    <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="{% url 'manage-jobs' %}" 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>

    <h1>
      {% for job in jobs %} {{job.company}} {{job.description}} {% endfor %}
    </h1>
  </body>
</html>

urls.py网址.py

urlpatterns = [
    path('', views.manage_jobs, name='manage-jobs'),
]

When you use.filter() it returns a list, even if there is only 1 item in the list, so your options are to:当您使用 .filter() 时,它会返回一个列表,即使列表中只有一项,所以您的选择是:

jobs = Job.objects.filter(user=request.user)[0]工作 = Job.objects.filter(user=request.user)[0]

or even better, use get()甚至更好,使用 get()

jobs = Job.objects.get(user=request.user)工作 = Job.objects.get(user=request.user)

put this view and try:提出这个观点并尝试:

@login_required(login_url='login')
def manage_jobs(request):
    if request.user.is_employee:
        return redirect('home')
    else:
        form = JobForm(request.POST)
        jobs = Job.objects.filter(user_id=request.user.id)
        if form.is_valid():
            form.save()
        context = {"form":form, "jobs":jobs}
        return render(request, 'employer/manage-jobs.html', context)

In case you are trying to override django's User method, you should tell settings so it can understand that when you call 'request.user' you want it to如果你试图覆盖 django 的 User 方法,你应该告诉设置,这样它就可以理解当你调用'request.user'时你想要它

AUTH_USER_MODEL = 'your_app.Account'

I recommend reading this article which explains how to extend/override django's User model我建议阅读这篇文章,它解释了如何扩展/覆盖 django 的用户 model

https://medium.com/@gabrielfgularte/custom-user-model-no-django-d9bdf2838bd8 https://medium.com/@gabrielfgularte/custom-user-model-no-django-d9bdf2838bd8

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM