python - Django: 提交表单时从 FormView 重定向到 DetailsView

相关表单视图:

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'),

我想让用户提交表单,然后被带到他们刚刚进入数据库的条目的详细信息页面。我已经尝试使用带有成功 url 的 reverse/reverse_lazy 来执行此操作,但这并没有成功。

我还尝试将以下内容添加到我的表单视图类中:

def get_success_url(self):
    test_recipe_id = self.object.id
    return reverse('recipeBook:recipe_details', pk=test_recipe_id)

在还将我的路径更改为:

re_path(r'(?P<pk>[^/]+)/recipedetails', views.recipedetails.as_view(), name='recipe_details'),

我收到以下 Value 错误:

AttributeError at /recipebook/addrecipe
'addrecipe' object has no attribute 'object'

回答1

您的解决方案就差不多完成了。

您可以使用 get_success_url 方法在模型之后获取配方 ID。这将允许您使用参数重定向。

class addrecipe(FormView):
    form_class = AddRecipeForm
    model = Recipe
    template_name = 'recipebook/addrecipe.html'
    fields = '__all__'
    extra_context = {
        'recipe_list': Recipe.objects.all()
    }
    
    #New method
    def get_success_url(self):
        test_recipe_id = self.object.id #gets id from created object
        return reverse('recipeBook:recipe_details', pk=test_recipe_id)

您的 detail url 未按预期接收参数,因此需要使用新的正则表达式

旧的重新配置:

path('<int:pk>/recipedetails', views.recipedetails.as_view(), name='recipe_details'),

新的:

from django.urls import path, re_path

re_path(r'(?P<pk>[^/]+)/recipedetails', views.recipedetails.as_view(), name='recipe_details),

回答2

我需要使用 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 本身仅在创建对象时创建。

反向返回不起作用,所以老实说,我很高兴玛丽在前面有一个 httpresponseredirect 并且它起作用了。如果我弄清楚原因,我会更新答案..

相似文章

最新文章