我使用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')
答案 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,并且有多种功能可以利用它,并期望合同能够得到满足。