【问题标题】:How to get object from previous view(CBV) in Django?如何从 Django 中的先前视图(CBV)中获取对象?
【发布时间】:2020-07-12 12:09:50
【问题描述】:

我试图从以前的 DetailView 中获取 CreateView 中的对象值。但失败了。有什么简单的方法吗?

在这段代码中,我怎样才能用 album.pk == idin CreateView) /strong> 根据 'item-add'(url(r'^(?P<id>[0-9]+)/pic/add/$', views.ItemCreate.as_view(), name='item-add'))

models.py

class Album(models.Model):
    credit = models.CharField(max_length=250)
    album_title = models.CharField(max_length=100)
    logo = models.FileField()

    def get_absolute_url(self):
        return reverse('picture:detail', kwargs={'pk': self.pk})

    def __str__(self):
        return self.album_title + ' - ' + self.credit


class Item(models.Model):
    album = models.ForeignKey(Album, on_delete=models.CASCADE)
    file_type = models.CharField(choices=TYPE_CHOICES, max_length=1)
    caption = models.CharField(max_length=100)

    class Meta:
        ordering = ('upload_date', 'caption')

    def get_absolute_url(self):
        return reverse('picture:item-detail', kwargs={ 'id': self.album_id , 'pk': self.pk})

    def __str__(self):
        return self.caption

views.py

class DetailView(generic.DetailView):
    model = Album
    template_name = 'picture/detail.html'

class ItemCreate(CreateView):
    model = Item
    fields = ['album', 'file_type', 'caption']

    def get_initial(self):
        album = ???
        return {
            'album': album,
            'file_type': 't',
        }

urls.py

urlpatterns = [
# /picture/<album_id>/
    url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
# /picture/<album_id>/<pic_id>
    url(r'^(?P<id>[0-9]+)/(?P<pk>[0-9]+)/$', views.ItemDetailView.as_view(), name='item-detail'),
# /picture/<album_id>/pic/add
    url(r'^(?P<id>[0-9]+)/pic/add/$', views.ItemCreate.as_view(), name='item-add'),
]

【问题讨论】:

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


    【解决方案1】:

    主键作为id URL 参数传递,因此您可以使用self.kwargs 访问它:

    from django.shortcuts import get_object_or_404
    
    class ItemCreate(CreateView):
        model = Item
        fields = ['album', 'file_type', 'caption']
    
        def get_initial(self):
            album = get_object_or_404(Album, pk=self.kwargs['id'])
            return {
                'album': album,
                'file_type': 't',
            }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 2020-09-04
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 2017-08-31
      相关资源
      最近更新 更多