在Django中创建一个视图,在没有表单的情况下将一条记录添加到M2M关系中

时间:2014-02-14 19:27:32

标签: django django-views django-queryset django-orm

我正在尝试创建一个简单的视图,将模型实例添加到不带表单的不同模型中。

背景: 我无法使用多选小部件,因为iPhone上的IOS7多选选项已被破坏。因此,无论如何,我正在创建一个解决方案实际上是一个更好的体验。

我想要一个接受两个PK的视图。它通过M2M使用子模型的实例更新父模型。但我想在没有表格的情况下这样做。

这是我到目前为止所拥有的:

网址:url(regex=r'^attt/(?P<parent_id>\d+)/(?P<child_id>\d+)/$', view=addChildToParent, name='add_child_to_the_parent',),

查看:

def addChildToParent(request, parent_id, child_id):
    """
    This view is about adding children to the parent.
    """

    user = get_object_or_404(User, id=request.user.id)

    if request.user != user:
        return permission_denied(request)

    try:
        parent = Parent.objects.get(id=request.parent_id)
        child = Child.objects.get(id=request.child_id)
        parent.parent_children.add(child)
        messages.success(self.request, "Your child was added!")
        return redirect('parent_overview', pk=parent.id)

    except Parent.DoesNotExist:
        raise Http404

错误:

addChildToParent() got an unexpected keyword argument 'parent_id'

阅读文档之后,似乎add()是我应该做的,用新的孩子更新父母和孩子之间的m2m。但它不起作用。实际的add()没有发生。

关于我做错了什么建议?

感谢。

2 个答案:

答案 0 :(得分:0)

当您在网址定义中命名了组时,它们将作为关键字参数传递给视图。如果您重命名视图,它应该可以工作:

def addChildToParent(request, parent_id, child_id):

然后,您可以直接参考这些参数。

答案 1 :(得分:0)

使用.save()方法保存实际关系。