使用PK重定向问题

时间:2017-09-14 08:41:11

标签: django django-models

我有一个非常奇怪的现象 在我的应用程序中,用户创建项目并使用其pk重定向到该项目详细信息。在该项目详细信息页面上,他被要求创建一个团队,当团队创建时,他会再次被重定向到项目详细信息页面但是错误的pk

例如:我刚刚创建了一个项目,我被重定向到... / project / 24。我被要求创建一个团队,我创建了它,但被重定向到../project/17任何想法为什么以及如何将我的页面重定向到正确的URL?

model.py:

class Team(models.Model):
    team_name = models.CharField(max_length=100, default = '')
    team_hr_admin = models.ForeignKey(MyUser, blank=True, null=True)

    def get_absolute_url(self):
        return reverse('website:ProjectDetails', kwargs = {'pk' : self.pk})

    def __str__(self):
        return self.team_name

class TeamMember(models.Model):
    user = models.ForeignKey(MyUser)
    team = models.ForeignKey(Team)

    def __str__(self):
        return self.user.first_name

class Project(models.Model):
    name = models.CharField(max_length=250)
    team_id = models.ForeignKey(Team, blank=True, null=True)
    project_hr_admin = models.ForeignKey(MyUser, blank=True, null=True)

    def get_absolute_url(self):
        return reverse('website:ProjectDetails', kwargs = {'pk' : self.pk})

    def __str__(self):
        return self.name

views.py

  class TeamCreate(CreateView):
    model = Team
    fields = ['team_name']
    template_name = 'team_form.html'

    def form_valid(self, form):
        valid = super(TeamCreate, self).form_valid(form)
        form.instance.team_hr_admin = self.request.user
        obj = form.save()
        #SELECT * FROM project WHERE user = 'current_user' AND team_id = NULL
        obj2 = Project.objects.get(project_hr_admin=self.request.user, team_id=None)
        obj2.team_id = obj
        obj2.save()
        return valid
        return super(TeamCreate, self).form_valid(form)

    def get_success_url(self):
        project = Project.objects.get(team_id=self.obj, project_hr_admin=self.request.user)
        return project.get_absolute_url()

2 个答案:

答案 0 :(得分:1)

这里的问题是你的CreateView引用了TeamObject而不是项目。

您应该覆盖get_success_url方法:

def get_success_url(self):
    project = Porject.objects.get(team_id=self.object, project_hr_admin=self.request.user)
    return project.get_absolute_url()

调用的函数是Team模型的get_absolute_url。所以你要调用项目详细信息视图,但是团队pk =>你得到一个随机项目,假设那个项目的pk与你的项目具有相同的价值,或者你发送的pk不存在,你会有404错误( pk不存在)。

def get_absolute_url(self):
        return reverse('website:ProjectDetails', kwargs = {'pk' : self.pk})

这是您的团队模型中的那个,但您调用了ProjectDetails。所以在这里,self.pk是Teaminstance.pk。

我在给你的代码中所做的是调用项目实例的get_absolute_url

但正如在另一个答案中所说,您应该删除或更改您的团队模型的get_absolute_url

答案 1 :(得分:0)

class Team(models.Model):  

    # ...

    def get_absolute_url(self):
            return reverse('website:ProjectDetails', kwargs = {'pk' : self.pk})
                                                                      ^^^^^^^

这里,错误的pk将被传递。感谢@Bestasttung澄清