【问题标题】:Django Alternative to PK in Form Action Parameter表单动作参数中 PK 的 Django 替代方案
【发布时间】:2019-09-09 07:17:04
【问题描述】:

我有两个处于父子关系的模型:IdeaComment。我正在使用 DRF 和嵌套的 DataTables 将这些模型提供给浏览器。要创建评论,必须知道相应的想法 ID。创建新评论的按钮如下所示,parentObjDataIdea id:

<button type="button" class="btn btn-primary js-create-idea-comment" data-url="/platform/ideas/comments/' + parentObjData + '/create/"><span class="fa fa-plus"></span> New Comment</button>

点击时会发生这种情况:

var loadForm = function () {
  var btn = $(this)
  $.ajax({
    url: btn.attr("data-url"),
    type: 'get',
    dataType: 'json',
    beforeSend: function () {
      $("#modal-activity").modal()
    },
    success: function (data) {
      $("#modal-activity .modal-content").html(data.html_form)
    }
  })
}

这很有效,并且在单击每个按钮时都会发送对正确 URL 的请求。这些视图演示了成功请求应该发生的情况:

def save_comment_form_create(request, form, template_name, parent_id):
    data = dict()
    if request.method == 'POST':
        if form.is_valid():
            instance = form.save(commit=False)
            instance.created_by_id = request.user.id
            instance.idea_id = parent_id
            form.save()
            data['form_is_valid'] = True
            comments = IdeaComment.objects.all()
            data['html_idea_comment_list'] = render_to_string('ic/includes/partial_idea_comment_list.html', {
                'comments': comments
            })
        else:
            data['form_is_valid'] = False
    context = {'form': form}
    data['html_form'] = render_to_string(template_name, context, request=request)
    return JsonResponse(data)


def idea_comment_create(request, parent_id):
    idea_id = parent_id
    if request.method == 'POST':
        form = IdeaCommentForm(request.POST)
    else:
        form = IdeaCommentForm()
    return save_comment_form_create(request, form, 'ic/includes/partial_idea_comment_create.html', idea_id)

partial_idea_comment_create.html 解析为这种形式:

<form method="post" action="{% url 'idea_comment_create' parent_id %}" class="js-idea-comment-create-form">
  {% csrf_token %}
  <div class="modal-header">
    <h4 class="modal-title">New Comment</h4>
    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
      <span aria-hidden="true">&times;</span>
    </button>
  </div>
  <div class="modal-body">
    {% include 'ic/includes/partial_idea_comment_form.html' %}
  </div>
  <div class="modal-footer">
    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
    <button type="submit" class="btn btn-primary">Create</button>
  </div>
</form>

这是网址:

url(r'^platform/ideas/comments/(?P<parent_id>\d+)/create/$', views.idea_comment_create, name='idea_comment_create'),

parent_id 是问题所在。如果我将一个数字硬编码到partial_idea_comment_create.html 中,一切都会很好(除了 cmets 的想法错误)。现在的方式,我得到这个错误:

NoReverseMatch at /platform/ideas/comments/1/create/
Reverse for 'idea_comment_create' with arguments '('',)' not found. 1 pattern(s) tried: ['platform/ideas/comments/(?P<parent_id>\\d+)/create/$']

对于不依赖父实例的普通pk,我会这样做:

<form method="post" action="{% url 'idea_update' form.instance.pk %}">

我应该如何将parent_id 动态加载到该 URL 中?

我认为这个问题部分存在:How do I pass a parent id as an fk to child object's ModelForm using generic class-based views in Django? 但我无法让它为我工作。

【问题讨论】:

  • 我看不到您将 parent_id 传递给 partial_idea_comment_create.html 模板上下文的位置。由于找不到 parent_id 它使用空字符串
  • 这是有道理的。我将如何通过它?我以为我在处理 Ajax 请求(即 parentObjDataparent_id)......但我承认我已经转过身来。
  • 这里 - data['html_form'] = render_to_string(template_name, context, request=request) 您需要在上下文数据中包含 parent_id。 context = {'form': form, 'parent_id: parent_id}`
  • 完美 - 如果您想制作一个,很乐意接受这个作为答案。

标签: javascript python ajax django django-rest-framework


【解决方案1】:

问题是您没有在模板上下文中传递parent_id。这就是你应该在save_comment_form_create 方法中做的事情:

...
context = {'form': form, 'parent_id': parent_id}
data['html_form'] = render_to_string(template_name, context, request=request)
return JsonResponse(data)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-21
    • 2014-08-26
    • 2016-08-08
    • 2012-05-17
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    相关资源
    最近更新 更多