我有一个非常奇怪的现象 在我的应用程序中,用户创建项目并使用其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()
答案 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澄清