创建实例

时间:2017-09-13 06:41:51

标签: python django django-models django-forms

我发现很难实现以下方案:

在我的应用中,用户创建了一个项目,现在他可以链接他创建的前一个团队或创建一个新团队。

团队可以成为许多项目的一部分,但项目只与一个团队相关联。

models.py

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

    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 ProjectCreate(CreateView):
    model = Project
    fields = ['name']
    template_name = 'project_form.html'

    def form_valid(self, form):
        form.instance.project_hr_admin = self.request.user
        return super(ProjectCreate, self).form_valid(form)

class ProjectDetailView(generic.DetailView):
    model = Project
    template_name = 'project_details.html'

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

    def form_valid(self, form):
        obj = form.save(commit=False)
        obj2 = Project.team_id
        obj2 = obj.team_id
        obj2.save()
        print("sucess")

我希望当用户创建团队时,以及团队是否成功创建。使用相应的team_id自动添加到项目模型。

任何帮助将不胜感激。提前谢谢!

1 个答案:

答案 0 :(得分:1)

好吧,您可以使用您的用户ID获取项目,该项目的team_id为null。 在form_valid视图的TeamCreate()方法中:

def form_valid(self, form):
     valid = super(TeamCreate, self).form_valid(form)
     obj = form.save()
     obj2 = Project.objects.get(project_hr_admin=self.request.user, team_id=None)
     obj2.team_id = obj
     obj2.save()
     return valid

在这里,您只需获得项目,其中您的用户为admin,null为team_id。

警告但是,如果管理员创建了两个没有团队的项目,请求Project.objects.get(...)将引发错误,因为它将返回多个对象。

因此,您必须确保它始终是一个项目,然后创建一个团队。

希望它有所帮助。