将主键传递给表单模板

时间:2017-10-08 16:57:17

标签: python django primary-key

这是这些问题的更新,如果我找到这个问题的完整答案,我会修改这些问题 - How do I 'Autofill' a CreateView field

我有一个Artist模型,我现在正尝试使用ArtistComment模式和模态div上的CreateView表单向DisplayView添加注释功能。我认为我真的很接近让这个工作,但我有一个小问题,将主键从我的artistdetail.html页面传递到我的artistcomment_form.html模板。任何有关此的帮助,或阅读文档页面的提示将不胜感激。

urls.py:

url(r'^artist-(?P<pk>[0-9]+)/$', login_required(views.ArtistDetailView.as_view()), name='artistdetail'),
url(r'^artist-(?P<pk>[0-9]+)/artistcomment/add/$', login_required(views.ArtistCommentCreate.as_view()), name='artistcomment-add'),

views.py:

class ArtistCommentCreate(CreateView):
    model = ArtistComment
    fields = ['message',]

    def get_success_url(self):
        return reverse('events:artistdetail', kwargs={'pk': self.object.artist_id})

    def form_valid(self, form, *args, **kwargs):
        form.instance.author = self.request.user
        form.instance.artist = get_object_or_404(Artist, id=self.kwargs.get('pk'))
        return super(ArtistCommentCreate, self).form_valid(form)

artistdetail.html:

<p id="commentfooter"><a href="{% url 'events:artistcomment-add' artist.id %}">Add A New Comment</a></p>

artistcomment_from.html:

{% block body %}
<div class="col-md-12">
<div class="panel panel-default">
  <div class="panel-body">
    <form class="form-horizontal" action="{% url 'events:artistcomment-add' pk %}" method="post" enctype="multipart/form-data" onSubmit="CloseModal();">
      {% csrf_token %}
      {% include "events/form-template.html" %}
      <div class="form-group">
        <div class="col-sm-offset-2 col-sm-10">
          <button type="submit" class="btn btn-success">Submit</button>
        </div>
      </div>
    </form>
  </div>
</div>

据我所知,我在artistcomment_form.html中输入'pk'的位置是我应该引用存储在URL中的主键。我已经尝试过artist.id artist.artistid artist.pk的各种组合,但这些是盲目的猜测让我无处可去。任何人都可以帮助解释我所缺少的东西吗?

1 个答案:

答案 0 :(得分:0)

您需要做的就是:

class ArtistCommentCreate(CreateView):
# ...

def get_context_data(self, **kwargs):
        context = super(ArtistCommentCreate, self).get_context_data(**kwargs)
        context['pk'] = # Whatever you want to add here (e.g. self.object.artist_id)
        return context

更好地将整个艺术家模型作为一个整体加载到您的上下文中,并在CreateView中添加一个模板(artistcomment.html),因为它需要一个。我认为可以将iFrame左右的视图(我从未尝试过)作为弹出窗口加载到您的页面中。 此外,您无需填写评论表单中的“操作”字段。