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 перед ним, и он сработал. Я обновлю ответ, если выясню причину...

Вернуться на верх