Как сослаться на слаг из другой модели в get_success_url? - PullRequest
1 голос
/ 18 октября 2019

Настройка

В моем приложении две модели. Один для журнала, а другой для записей в этом журнале. Я написал класс CreateView, который позволит пользователю создавать запись журнала для любого идентификатора журнала, в настоящее время находящегося в нем. В идеале я хочу, чтобы класс обновлялся обновленной записью, или, другими словами, get_success_url должен вести страницу, на которой мы в настоящее время расположены.

views.py

class ToJournalEntriesList(LoginRequiredMixin, CreateView):
    model = to_journal_entry
    template_name = 'to_journals/to_journal_entries_list.html'
    fields = ('body',)

    def get_success_url(self):
        return reverse('to-journals', kwargs={'slug':self.object.slug})

    def form_valid(self, form):
        current_journal = to_journal.objects.get(journal_user=self.request.user, slug=self.kwargs['slug'])
        form.instance.journal_user = self.request.user
        form.instance.journal_name = current_journal
        return super(ToJournalEntriesList, self).form_valid(form)

    def get_context_data(self, **kwargs):
        context = super(ToJournalEntriesList, self).get_context_data(**kwargs)
        context['to_journal_entries'] = to_journal_entry.objects.all()
        return context

models.py

class to_journal(models.Model):
    journal_name = models.CharField(max_length = 40)
    slug = AutoSlugField(populate_from='journal_name')
    date_created = models.DateTimeField(auto_now_add=True)
    journal_user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE,)

    def __str__(self):
        return str(self.journal_user) + " " + self.journal_name

    def get_absolute_url(self):
        return reverse('to-journals')


class to_journal_entry(models.Model):
    body = models.TextField()
    entry_date = models.DateTimeField(auto_now_add=True)
    journal_name = models.ForeignKey(to_journal, on_delete=models.CASCADE,)
    journal_user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE,)

    def __str__(self):
        return str(self.journal_name) + " " + str(self.entry_date)

    def get_absolute_url(self):
        return reverse('to-journal-entries', args=(self.slug))

urls.py

urlpatterns = [
    path('', CreateToJournal.as_view(), name='to-journals'),
    path('<slug:slug>', ToJournalEntriesList.as_view(), name='to-journal-entries'),
]

Ошибка

С текущей настройкой, которую я имею:

enter image description here

Какиеимеет смысл, потому что модель to_journal_entry не имеет этого поля.

Вопрос

Я уверен, что и мои get_success_url() в views.py и get_absolute_url() в models.py выполнены неправильно, но я не смог найти хорошее объяснение того, как они работают. Как мне настроить их для достижения желаемого результата? Большое спасибо заранее!

Я ценю всех, кто посмотрел. Бест, Расул.

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Вы можете просто следить за отношениями:

def get_success_url(self):
    return reverse('to-journals', kwargs={'slug': self.object.journal_name.slug})
1 голос
/ 18 октября 2019

Ваш self.object является to_journal_entry. Вы, вероятно, хотите использовать to_journal, вы можете сделать это, получив journal_name:

class ToJournalEntriesList(LoginRequiredMixin, CreateView):
    model = to_journal_entry
    template_name = 'to_journals/to_journal_entries_list.html'
    fields = ('body',)

    def get_success_url(self):
        return reverse('to-journals', kwargs={ 'slug': <b>self.object.journal_name.slug</b> })

Примечание : обычно названия моделей записываются вPerlCase, поэтому JournalEntry вместо to_journal_entry.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...