【问题标题】:Set up current Album 'pk' in genericView在 genericView 中设置当前专辑“pk”
【发布时间】:2018-02-17 22:11:43
【问题描述】:

我正在尝试从Album 中删除object (foto),并且我希望views 返回到detail view(当前专辑),但我无法设置当前专辑的pk。我尝试了各种方法,但我无法弄清楚并解决它。 也许我应该为照片对象添加一些独立的foto_pk,或者使用一些通常的定义来代替通用的DeleteView?我没主意了。请给我一些线索...谢谢。

网址:

url(r'^$', views.IndexView.as_view(), name='index'),

url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),

url(r'albumadd/$', views.AlbumCreate.as_view(), name='album-add'),

url(r'update/(?P<pk>[0-9]+)/$', views.AlbumUpdate.as_view(), name='albumbum-update'),

url(r'delete/(?P<pk>[0-9]+)/$', views.AlbumDelete.as_view(), name='albumbum-delete'),

url(r'^(?P<pk>[0-9]+)/fotoadd/$', views.FotoCreate.as_view(), name='foto-add'),

url(r'^(?P<pk>[0-9]+)/fotodelete/$', views.FotoDelete.as_view(), name='foto-delete'),

观看次数:

class FotoDelete(LoginRequiredMixin, DeleteView):
    model = Foto

    def album(request, pk):
        album = Album.objects.get(pk=pk)
        return reverse_lazy('albumbum:detail', kwargs={'pk': album.pk})

其他尝试视图:

class FotoDelete(LoginRequiredMixin, DeleteView):
    model = Foto
    success_url = reverse_lazy('albumbum:detail', kwargs={'pk': Album.pk})

其他尝试视图:

class FotoDelete(LoginRequiredMixin, DeleteView):
    model = Foto
    album = get_object_or_404(Album, pk=pk)
    success_url = reverse_lazy('albumbum:detail', kwargs={'pk': album.pk})

我还附加了照片的 CreateView(相册中的对象): (也许这是解决这个问题的东西)

class FotoCreate(CreateView):
    model = Foto
    fields = ['nazwa_foto', 'obraz']

    def form_valid(self, form):
        f = Album.objects.get(pk=self.kwargs.get('pk'))
        form.instance.albumnr = f
        return super(FotoCreate, self).form_valid(form)

    def get_success_url(self):
        return reverse('albumbum:detail', kwargs={'pk': self.kwargs.get('pk')})

models.py

class Album(models.Model):
    user = models.ForeignKey(User)
    nazwa_albumu = models.CharField(max_length=500, default="nazwa Albumu")
    temat = models.CharField(max_length=100, default="temat")
    opis_albumu = models.TextField(max_length=2000, default="opis")
    album_logo = models.CharField(max_length=1000, default="link http:// do logo")

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

    def __str__(self):
        return self.nazwa_albumu + ' - ' + str(self.user)


class Foto(models.Model):
    albumnr = models.ForeignKey(Album, on_delete=models.CASCADE)
    nazwa_foto = models.CharField(max_length=250, default='nazawa foto')
    obraz = models.CharField(max_length=1000, default='link http:// do obrazu')

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

    def __str__(self):
        return self.nazwa_foto

【问题讨论】:

  • 请包含models.py

标签: python django django-views django-generic-views


【解决方案1】:

试试这个,应该可以的。

class FotoDelete(LoginRequiredMixin, DeleteView):
    model = Foto

    def get_success_url(self):
         fotoid = self.kwargs['pk']
         foto = get_object_or_404(Foto, id=fotoid)
         album_id = foto.albumnr.pk
         return reverse_lazy('albumbum:detail', kwargs={'pk': album_id})

【讨论】:

  • 它不起作用。将我重定向到/albumbum/31/fotodelete/None(找不到页面),31 是照片的pk,但我需要将我重定向到/albumbum/2,其中2 是我的相册pk .当我手动设置 kwargs={'pk': 2 } 它适用于所有情况,但这就是问题所在,如何从该专辑对象的级别检索“album.pk”。
  • 我已经更新了我的答案,检查它是否有效。不过它应该可以工作。
  • 是的,确实有效,但我想在从相册中删除对象后将我重定向到同一个相册(真的我想在删除对象期间留在同一个相册页面)并且您的解决方案重定向我要索引所有专辑的位置,而不是 albumbum:detail,我需要在该专辑中放一些 pk
  • 你不能这样做,因为你正在使用pk 删除所以一旦pk 被删除,你就不能使用相同的pk 去详细说明。
  • 请包含models.py
【解决方案2】:

这也有效:

class FotoDelete(DeleteView):
    model = Foto

    def get_success_url(self):
        fotoid = self.kwargs['pk']
        foto = get_object_or_404(Foto, pk=fotoid)
        album_id = foto.albumnr.pk
        return reverse('albumbum:detail', kwargs={'pk': album_id})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 2010-11-10
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多