Django: Перенаправление из FormView в DetailsView при отправке формы
Relevant FormView:
class addrecipe(FormView):
form_class = AddRecipeForm
model = Recipe
template_name = 'recipebook/addrecipe.html'
fields = '__all__'
extra_context = {
'recipe_list': Recipe.objects.all()
}
Соответствующая форма:
class AddRecipeForm(forms.ModelForm):
name = forms.CharField(max_length="50", label="Recipe Name")
description = forms.Textarea(attrs={'class': 'desc-text-area'})
servings = forms.IntegerField()
tools = forms.ModelMultipleChoiceField(queryset=Tool.objects.all(), widget=forms.CheckboxSelectMultiple, required = True, help_text="Select all relevant tools")
class Meta:
model = Recipe
fields = ("__all__")
Шаблон URL для страницы просмотра деталей:
path('<int:pk>/recipedetails', views.recipedetails.as_view(), name='recipe_details'),
Я хочу, чтобы пользователь отправлял форму, а затем переходил на страницу подробностей записи, которую он только что внес в базу данных. Я пытался сделать это, используя reverse/reverse_lazy с url успеха, но это не дало результата.
Я также попробовал добавить следующее в класс представления формы:
def form_valid(self, form):
test_recipe = Recipe.save()
return redirect('recipe_details', pk=test_recipe.pk)
Ваше решение было почти готово.
Вы могли бы использовать метод form_valid для получения ID рецепта перед сохранением модели. Это позволит вам перенаправлять с параметрами.
def form_valid(self,form):
test_recipe = form.save(commit=False)
testrecipe_id = test_recipe.id
test_recipe.save()
return redirect('recipe_details', pk=test_recipe_id)
Сохраняя commit=False, вы получаете объект модели, который позволяет получить id и даже манипулировать данными. Дальнейшее чтение
Мне нужно было использовать HttpResponseRedirect для правильного перенаправления. В итоге мое представление выглядело следующим образом:
class addrecipe(FormView):
form_class = AddRecipeForm
model = Recipe
template_name = 'recipebook/addrecipe.html'
fields = '__all__'
extra_context = {
'recipe_list': Recipe.objects.all()
}
def form_valid(self, form):
test_recipe = form.save(commit=False)
test_recipe.save()
test_recipe_id = test_recipe.id
return HttpResponseRedirect(reverse('recipeBook:recipe_details', kwargs={'pk': test_recipe_id}))
Сохранение объекта перед захватом ID представляется необходимым шагом, так как я обнаружил, что сам ID создается только при создании объекта.
Обратный возврат не работал, поэтому, честно говоря, я сделал httpresponsponseredirect перед ним, и он сработал. Я обновлю ответ, если выясню причину...