如何在get_success_url中引用来自其他模型的块?

时间:2019-10-18 14:13:38

标签: django django-models django-forms django-views

设置

我的应用程序中有两个模型。一个用于期刊,另一个用于该期刊的条目。我编写了一个CreateView类,该类将允许用户为当前位于的任何Journal id创建一个Journal条目。理想情况下,我希望该类使用更新的条目“刷新”,换句话说,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模型没有该字段。

问题

我确定 views.py 中的get_success_url() models.py 中的get_absolute_url()都做错了,但是我找不到很好地解释了这些工作原理。我应该如何设置它们以获得期望的结果?在此先感谢一吨!

我非常感谢大家的关注。最好,拉苏尔。

2 个答案:

答案 0 :(得分:2)

您可以按照以下关系进行操作:

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

答案 1 :(得分:1)

您的self.objectto_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': self.object.journal_name.slug })
  

注意:通常,模型的名称是用PerlCase编写的,因此使用JournalEntry而不是 to_journal_entry