Ссылка на параметр из связанного объекта модели внутри DeleteView для передачи моему get_success_url?

У меня есть эта модель, связанная с моей моделью пользовательской схемы:

class EntrepreneurshipOffer(models.Model):

    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
...

Кроме того, у меня есть представление с именем EntrepreneurshipOffersByUser, которое позволяет мне перечислить все предложения, которые я создал.

class EntrepreneurshipOffersByUser(LoginRequiredMixin, UserProfileDataMixin, ListView):
    template_name = 'entrepreneurship/my_entrepreneurship_offer_list.html'

    def get_queryset(self, *args, **kwargs):
        user = self.request.user
        queryset_list = EntrepreneurshipOffer.objects.filter(created_by__username=user.username)
        return queryset_list

    def get_context_data(self, **kwargs):
        context = super(EntrepreneurshipOffersByUser, self).get_context_data(**kwargs)
        user = self.request.user
        entrepreneurship_offers = EntrepreneurshipOffer.objects.filter(created_by__username=user.username)
        context['offers_by_user'] = entrepreneurship_offers
        return context

URL-адреса для просмотра моих EntrepreneurshipOffer объектов:

# Main URL which call to Entrepreneurship Offer URLs
url(r'^offer/entrepreneurship/', include('entrepreneurship.urls', namespace='offer')),

# List Entrepreneurship Offer's user
    url(r'^by/u/(?P<username>[-\w]+)/$',
        EntrepreneurshipOffersByUser.as_view(),
        name='list'),
    ]

Мой вопрос связан с целью удаления EntrepreneurshipOffer и последующего перенаправления рабочего процесса на мои объекты списка EntrepreneurshipOffer, упомянутые выше.

У меня есть представление на основе класса EntrepreneurshipOfferDeleteView с методом get_success_url, в котором я вызываю URL-адрес, чтобы перечислить мои объекты, передающие пространство имен и имя URL-адреса, упомянутое выше, добавляя параметр username, требуемый URL-адресом.

class EntrepreneurshipOfferDeleteView(SuccessMessageMixin, UserProfileDataMixin, LoginRequiredMixin, DeleteView):
    model = EntrepreneurshipOffer
    #success_url = reverse_lazy("offer:list")
    success_message = "Oferta de emprendimiento eliminada con éxito"

    def get_success_url(self):
        entrepreneurship_offer = self.get_object()
        #print(entrepreneurship_offer)
        return reverse_lazy("offer:list", kwargs={'created_by': entrepreneurship_offer.created_by.username})

Мне нужно передать параметр username, но, похоже, я делаю не так, потому что, несмотря на то, что параметр username добавлен в рабочий процесс, через self.get_object() я получаю эту ошибку:

NoReverseMatch at /offer/entrepreneurship/modelo-de-negocio/delete/
Reverse for 'list' with arguments '()' and keyword arguments '{'created_by': 'bgarcial'}' not found. 1 pattern(s) tried: ['offer/entrepreneurship/by/u/(?P<username>[-\\w]+)/$']

Я новичок в представлениях на основе классов, поэтому я уверен, что для этого есть очевидное решение, но я его еще не нашел.

Буду признателен за любую оказанную помощь. Спасибо.


person bgarcial    schedule 26.03.2018    source источник


Ответы (1)


Ваш URL определяется следующим образом:

url(r'^by/u/(?P<username>[-\w]+)/$',
    EntrepreneurshipOffersByUser.as_view(),
    name='list'),
]

таким образом, требуется параметр username. Однако вы пытаетесь назвать его как
reverse_lazy("offer:list", kwargs={'created_by': entrepreneurship_offer.created_by.username}), то есть используя created_by. Попробуйте изменить его на

reverse_lazy("offer:list", kwargs={'username': entrepreneurship_offer.created_by.username}) и он должен работать (или, по крайней мере, должен выдавать другую ошибку).

person Serafeim    schedule 28.03.2018