【问题标题】:Django CreateView success url with pk from different unrelated model带有来自不同不相关模型的 pk 的 Django CreateView 成功 url
【发布时间】:2020-07-17 23:14:08
【问题描述】:

我有一个 django CreateView,用户可以在其中创建新单词。我还有一个不相关的Song 模型,用户可以在其中选择从歌曲的歌词中添加单词。所以我为此创建了一个单独的CreateView,这样我就可以有一个不同的成功网址。成功 url 应该返回到用户正在浏览的歌曲。但我正在努力弄清楚如何将这个特定对象的 pk 传递给不同模型的 CreateView

这是我的特别CreateView

class CreateWordFromSong(LoginRequiredMixin, generic.CreateView):
    template_name = 'vocab/add_custom_initial.html'
    fields = ("target_word","source_word", etc.)
    model = models.Word
    from videos.models import Song

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return super(CreateWordFromSong, self).form_valid(form)

    success_url = reverse_lazy('videos:song-vocab', kwargs={'pk': song_pk) #how to get song_pk?

当我用实际的 pk 替换 song_pk 时,一切正常。

我覆盖form_valid 以便用户可以保存新对象。也许有一种方法可以改变它,以便我也可以获得song_pk?我已经玩了一点,但没有运气。

我从我的网址获得了song_pk

path('song/<int:song_pk>/', views.CreateWordFromSong.as_view(), name='create-song'),

所以我应该可以访问它。但是当我尝试将它添加到我的视图中时:

class CreateWordFromSong(LoginRequiredMixin, generic.CreateView, song_pk)

我收到错误:name 'song_pk' is not defined

【问题讨论】:

  • self.kwargs.get('song_pk')
  • @Blackdoor 我试过了,但后来我得到了NameError: name 'self' is not defined
  • 覆盖get_success_url(self)函数返回success_url

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


【解决方案1】:

您可以添加class CreateWordFromSong 而不是success_url 方法get_success_url

    def get_success_url(self):
       return reverse_lazy('videos:song-vocab', kwargs={'pk': self.kwargs.get('song_pk')})

如果模板中的操作是这样的,那就可以了

<form action="{% url 'create-song' song_pk=song.pk %}" method="post">

【讨论】:

    【解决方案2】:

    (肯定是最近...)

    我遇到过类似的情况,但与您的情况不符。

    我有一个与 Flow 对象(父对象和 ForeignKey)相关的映射对象(子对象)列表。 此列表使用 Flow PK。

    urls.py

    path('flow/<int:pk>/mapping',
         mappingColumnOneFlowListView.as_view(), name='mapping-details'),
    

    在 Mapping 对象的每一行上,我都有一个“删除”按钮。 删除后,我想返回到 Flow Mapping 列表,但由于视图中使用的 PK 导致(已删除)映射,所以无法返回。 另一种解决方案是指向另一个没有 pk 的 URL(例如,模型中的 absolute_url),但这不是我想要的。

    这肯定不是实现目标的最佳方式,但我发现了这一点:

    在我的 DeleteView 中我添加了:

    def get_success_url(self):
        pk = self.kwargs['pk']       #  Mapping's PK
        flow_pk = MappingField.objects.filter(
            pk=pk).first().fl_id.pk        # fl_id.pk = Flow's PK (FK)
        return reverse('mapping-details', kwargs={'pk': flow_pk})
    

    【讨论】:

      猜你喜欢
      • 2018-12-31
      • 2020-01-30
      • 2016-01-24
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多