Search code examples
pythondjangodjango-viewsdjango-generic-views

Set up current Album 'pk' in genericView


I'm trying to delete object (foto) from Album and I want views to return to detail view (current Album) but I can't set up pk of current Album . I tried various ways but I can't figure it out and solve it. Maybe I should add some independent foto_pk for foto's objects, or instead of generic DeleteView use some usual definition? I'm out of ideas. Please give me some clues... Thanks.

URLs:

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'),

Views:

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})

other try Views:

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

other try Views:

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

also I append CreateView of foto (objects in album): (maybe here is something that casing that problem)

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

Solution

  • Try this, it should work.

    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})