【问题标题】:Django redirect to DetailView From FormViewDjango 从 FormView 重定向到 DetailView
【发布时间】:2022-11-06 04:02:30
【问题描述】:

我想要做的是有一个带有单个字段的表单,该字段获取主键并重定向到该主键的 DetailView。虽然我可以通过拥有一个 ListView 然后从 ListView 转到 DetailView 来实现这一点,但这是我不需要的额外步骤,因为我已经有一个主键。任何帮助,将不胜感激。

模型.py

class Book(models.model):
    book_id = models.TextField(primary_key=True)
    # some other fields
    def get_absolute_url(self):
        return reverse('book-detail', kwargs={'pk':self.pk})

表格.py

class BookSearchForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ['book_id']

视图.py

class BookDetailView(DetailView):
    model = Book
    template_name = 'book-detail.html'

使用 ListView 我可以这样做:

class BookListView(ListView):
    template_name = 'book-list.html'
    form_class = BookSearchForm

    def get_queryset(self, *args, **kwargs):
        qs = super().get_queryset(*args, **kwargs)
        book_id = self.request.Get.get('book_id', None)
        if book_id:
            qs=qs.filter(book_id=book_id).first()
        if not book_id:
            qs=qs.none()
        return qs

没有 ListView 怎么办?

class BookSearchView(FormView):
    template_name = 'book-search.html'
    form_class = BookSearchForm
    # what should I do here, form_valid, get?

网址.py

urlpatterns = [
    path('book/search/',BookSearchView.as_view(),name='book-search'),
    path('book/<str:pk>/',BookDetailView.as_view(),name='book-detail')
]

图书搜索.html

<form action="." method="GET">
    {{form}}
</form>

【问题讨论】:

    标签: django-forms django-class-based-views


    【解决方案1】:

    好吧,要重定向到 DetailView,您可以在 FormView 中指定成功 url,如下所示:

    class BookSearchView(FormView):
        template_name = 'book-search.html'
        form_class = BookSearchForm
        success_url = '' # The url that you want to direct after form is validated 
        
         def form_valid(self, form):
            # This method is called when valid form data has been POSTed.
            # It should return an HttpResponse.
            
            return super().form_valid(form)
    

    【讨论】:

    • 谢谢,但这并没有解决问题。我已经在 form_valid 中尝试了 self.book_id = form.cleaned_data['book_id'] ,然后在 get_success_url 中返回 reverse('book-detail', kwargs={'book_id':self.book_id}) 但仍然无法正常工作.
    【解决方案2】:

    除非我弄错了,否则它似乎正试图从不具有该属性的 BookSearchView 对象访问 book_id。我认为您可以通过像这样覆盖form_valid 来访问创建的对象

    def form_valid(self, form) -> HttpResponse:
            self.object = form.save()
            .....
            return super().form_valid(form)
    

    然后您将可以访问对象,您可以使用该对象在 get_success_url 方法中访问 book_id,如下所示

    def get_success_url(self) -> str:
            return reverse_lazy('book-detail', kwargs={'book_id': self.object.book_id})
    

    我觉得可能有更好的方法,但这就是我让它工作的方式。

    【讨论】:

      猜你喜欢
      • 2013-05-31
      • 2019-10-21
      • 2017-05-30
      • 1970-01-01
      • 2015-01-15
      • 2019-08-04
      • 2011-09-21
      • 2020-06-22
      • 2019-04-17
      相关资源
      最近更新 更多