django 如何在CreateView中获取已创建的对象

s5a0g9ez  于 2023-05-01  发布在  Go
关注(0)|答案(5)|浏览(142)

在这里,我使用CreateView来创建项目,之后我将重定向用户以更新当前创建的对象的其他字段。
下面是我的代码:

Views.py

class DynamicCreate(CreateView):
    model = Dynamic
    form_class = DynamicForm
    template_name = 'book/dynamic_create.html'

    def form_valid(self, form):
        book = form.save(commit=False)
        book.user = User.objects.get(pk=(self.request.user.pk))
        book.save()
        return reverse('book:dynamicupdate', args=(self.object.id))

Urls.py

url(r'^book/create/$', views.DynamicCreate.as_view(), name='dynamiccreate'),
url(r'^book/delete/(?P<pk>[\w]+)/$', views.DynamicDelete.as_view(), name='dynamicdelete'),
url(r'^book/update/(?P<pk>[\w]+)/$', views.DynamicUpdate.as_view(), name='dynamicupdate'),

但在这里我得到的错误:

Exception Type:     AttributeError
Exception Value:    'NoneType' object has no attribute 'id'

我通过其他以前问过的问题,如This,但我不知道我在这里错过了什么。我的CreateView能够在表中创建/保存数据,但无法重定向我更新视图页。

gwbalxhn

gwbalxhn1#

继承自ModelFormMixin的form_valid方法包含设置self的逻辑。对象复制到新创建的对象,但重写方法使用book变量。将args更改为参考书,如上所述,效果很好。
另一个选择是用self替换book变量。对象,如果只是遵循默认方法设置的示例。

0g0grzrc

0g0grzrc2#

我通过将return reverse('book:dynamicupdate', args=(self.object.id))更改为return redirect('book:dynamicupdate', book.id)来修复它
反向需要ViewName不是url,所以我将reverse改为redirect,这里我的对象是book,所以我将self.object替换为book
感谢@丹尼尔Roseman的帮助

jyztefdp

jyztefdp3#

正如solarissmoke所解释的,'form_valid'必须返回一个响应对象,而不是一个url!
然后我会写:

class DynamicCreate(CreateView):
    model = Dynamic
    form_class = DynamicForm
    template_name = 'book/dynamic_create.html'
    success_url = reverse("dynamic_list")

    def form_valid(self, form):
        # Catch an instance of the object
        book = form.save(commit=False)
        book.user_id = self.request.user.id
        book.save()
        self.success_url = reverse('book:dynamic_detail', args=[str(book.id)])
        return super(DynamicCreate, self).form_valid(form)

注意:book.user.id = self.request.user.id而不是用户示例
更简洁的是,在www. example中添加get_absolute_url www.example.com

def get_absolute_url(self):
    return reverse('dynamic_detail', args=[str(self.id)])

并在视图中引用此函数:

class DynamicCreate(CreateView):
    model = Dynamic
    form_class = DynamicForm
    template_name = 'book/dynamic_create.html'
    success_url = reverse("book_list")

    def form_valid(self, form):
        # Catch an instance of the object
        book = form.save(commit=False)
        book.user_id = self.request.user.id
        book.save()
        self.success_url = self.model.get_absolute_url(book)
        return super(DynamicCreate, self).form_valid(form)
0s7z1bwu

0s7z1bwu4#

尝试将该行更改为:

return reverse('book:dynamicupdate', args=(book.id))

在代码中的任何地方都没有定义self.object。

a0zr77ik

a0zr77ik5#

通过在模型中定义get_absolute_url,您可以重定向到“book:dynamicupdate”,并使用创建/更新示例的pk。
models.py

from django.db import models
from django.urls import reverse

class Dynamic(models.Model):
    ...

    def get_absolute_url(self):
        return reverse("book:dynamicupdate", kwargs={"pk": self.pk})

urls.py

app_name = 'book'
urlpatterns = [
    path('/path/<int:pk>/', views.YourUpdateView.as_view(), name='dynamicupdate'),
]

参见 www.example.com

相关问题