Django:在CreateView中访问表单参数以传递给get_success_url

时间:2018-08-28 18:00:48

标签: django python-3.x

我使用CreateView让用户创建作品。作品将自动被分配一个ID。在用户创建作品后,我想使用get_success_url重定向到另一个CreateView以添加作品的版本。 首先,我不知道Piece的ID来自何处(因为它是自动生成的;我想这是模型中Piece的行号)。 如何访问此ID并将其传递给get_success_url? CreateView中的get_context_data方法似乎无法获取Piece ID。

views.py

class PieceCreate(LoginRequiredMixin, CreateView):
    model = Piece
    fields = ['title', 'summary', 'created', 'piece_type']
    initial = {'created': datetime.date.today()}

    def form_valid(self, form):
        form.instance.creator = Creator.objects.get(user=self.request.user)
        return super(PieceCreate, self).form_valid(form)

    def get_context_data(self, **kwargs):
        context = super(PieceCreate, self).get_context_data(**kwargs)
        return context['id']

    def get_success_url(self):
        return reverse_lazy('pieceinstance-create', kwargs={'pk': self.get_context_data()})

urls.py

path('pieceinstance/create/<int:pk>', views.PieceInstanceCreate.as_view(), name='pieceinstance-create')

1 个答案:

答案 0 :(得分:3)

可以使用self.object [Django-doc]访问CreateView中构造的实例,因此可以使用self.object.pk获取主键:

class PieceCreate(LoginRequiredMixin, CreateView):
    model = Piece
    fields = ['title', 'summary', 'created', 'piece_type']
    initial = {'created': datetime.date.today()}

    def form_valid(self, form):
        form.instance.creator = Creator.objects.get(user=self.request.user)
        return super(PieceCreate, self).form_valid(form)

    def get_success_url(self):
        return reverse_lazy('pieceinstance-create', kwargs={'pk': self.object.pk})

我建议不要以这种方式覆盖get_context_data函数:首先,合同规定应返回dict ionion,而不是id,并且有多种功能可以利用它,并期望合同能够得到满足。