【问题标题】:Django CBV CreateView - Redirect from CreateView to last pageDjango CBV CreateView - 从 CreateView 重定向到最后一页
【发布时间】:2019-03-20 06:48:23
【问题描述】:

我正在学习 Django,我在从 CreateView 重定向回来时遇到问题我想重定向到 BookDetail 页面,该页面包含由 CreateView 创建的 bookinstances 列表。 模型.py:

class BookInstance(models.Model):
    """Model representing a specific copy of a book (i.e. that can be borrowed from the library)."""
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text='Unique ID for this particular book across whole library')
    book = models.ForeignKey('Book', on_delete=models.SET_NULL, null=True) 
    imprint = models.CharField(max_length=200)
    due_back = models.DateField(null=True, blank=True)
    borrower = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
    LOAN_STATUS = (
        ('m', 'Maintenance'),
        ('o', 'On loan'),
        ('a', 'Available'),
        ('r', 'Reserved'),
    )

    status = models.CharField(
        max_length=1,
        choices=LOAN_STATUS,
        blank=True,
        default='m',
        help_text='Book availability',
    )


    class Meta:
        ordering = ['due_back']
        permissions = (("can_mark_returned", "Set book as returned"),)  

    def __str__(self):
        """String for representing the Model object."""
        return f'{self.id} ({self.book.title})'

    @property
    def is_overdue(self):
        if self.due_back and date.today() > self.due_back:
            return True
        return False

views.py

class BookInstanceCreate(PermissionRequiredMixin, CreateView):
    model = BookInstance
    fields = '__all__'
    permission_required = 'catalog.can_mark_returned'
    initial = {'Book': Book}
    success_url = reverse_lazy('book-detail')

urls.py

urlpatterns += [
    path('book/create/instance', views.BookInstanceCreate.as_view(), name='book_create_instance'),
    path('book/<int:pk>', views.BookDetailView.as_view(), name='book-detail'),
]

success_url 似乎在这里不起作用,因为重定向 url 需要有关书籍主键的信息。我已经尝试了几个选项。 `

next = request.POST.get('next', '/')
return HttpResponseRedirect(next)

return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))

但它似乎对我不起作用。有人可以指导我如何编辑 View 以便在提交表单后重定向吗?

编辑:有我的模板代码:

{% extends "base_generic.html" %}

{% block content %}
  <form action="" method="post">
    {% csrf_token %}
    <table>
    {{ form.as_table }}
    </table>
    <input type="submit" value="Submit" class='btn btn-dark'>
    <input type="hidden" name="next" value="{{ request.path }}">
  </form>
{% endblock %}

【问题讨论】:

    标签: django django-forms django-views


    【解决方案1】:

    你需要定义get_success_url方法,而不是静态的success_url属性:

    class BookInstanceCreate(PermissionRequiredMixin, CreateView):
        ...
        def get_success_url(self):
            return reverse('book-detail', kwargs={'pk': self.object.pk})
    

    【讨论】:

    • 如何访问此详细视图的主键?我用过: class BookInstanceCreate(PermissionRequiredMixin, CreateView): model = BookInstance fields = 'all' permission_required = 'catalog.can_mark_returned' initial = {'Book': Book} def get_success_url(self): return reverse ('book-detail', kwargs={'pk': self.book.pk}) 现在我有错误:/catalog/book/create/instance 'BookInstanceCreate' 对象的 AttributeError 没有属性 'book'
    • 应该是self.object.pk
    • 仍然得到错误:Reverse for 'book-detail' with keyword arguments '{'pk': UUID('25f6ba52-2b6e-45cd-859d-dcc4e79f30ec')}' not found。尝试了 1 种模式:['catalog/book/(?P[0-9]+)$'] 我认为问题是因为我正在添加 BookInstance 并希望重定向回图书详细信息页面不是 Bookinstance。我要访问的“PK”在 Book(model) > get_absolute_url
    • 等等,Book 和 BookInstance 一样吗?而且我对那里的 UUID 感到困惑,您收到错误的原因是您的 URL 需要一个数字 id 而不是 UUID。
    • 我解决了我不得不使用的问题:self.object.book.pk,因为 book 是 bookinstance 的外键,self.object.pk 从 BookInstance 模型中获取了id。感谢您的帮助,我在发布之前浪费了几个小时。
    猜你喜欢
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 2013-09-08
    • 2019-11-26
    • 2019-09-07
    • 2016-09-18
    相关资源
    最近更新 更多